DevExpress Add ASPxGridView template columns at runtime

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
    Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridPlan.aspx.cs" Inherits="PlanTest.Layouts.PlanTest.GridPlan"
    DynamicMasterPageFile="~masterurl/default.master" %>

<%@ Register Assembly="DevExpress.Web.v11.1, Version=11.1.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxHiddenField" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.v11.1, Version=11.1.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxCallback" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %>
<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
    <script type="text/javascript" language="javascript">
        function GetSaveData() {
            var rowCount = gdv.GetVisibleRowsOnPage();
            var valueStr = '';
            var colNameStr = hdl.Get("colNames");
            for (var i = 0; i < rowCount; i++) {
                var colNames = new Array();
                colNames = colNameStr.split(',');
                var id = gdv.GetRowKey(i);
                for (var j = 0; j < colNames.length; j++) {
                    var txtClientName = 'txt' + id + colNames[j];
                    var txtEditor = ASPxClientControl.GetControlCollection().GetByName(txtClientName);
                    valueStr = valueStr + txtEditor.GetText() + '&' + txtEditor.cpID + '|';
                }
            }
            return valueStr;
        }
    </script>
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <dx:ASPxCallback ID="clb" runat="server" ClientInstanceName="clb" OnCallback="clb_OnCallback">
        <ClientSideEvents CallbackComplete="function(s, e){
                            if(e.result=='0')
                            {
                                //error
                                alert('失败,联系管理员');
                            }
                            else
                            {
                                //yes
                                alert('成功');
                                gdv.Refresh();
                            }
        }" />
    </dx:ASPxCallback>
    <dx:ASPxHiddenField ID="hdl" runat="server" ClientInstanceName="hdl">
    </dx:ASPxHiddenField>
    <dx:ASPxGridView ID="gdv" ClientInstanceName="gdv" runat="server" OnLoad="gdv_OnLoad"
        KeyFieldName="ID">
        <Columns>
            <dx:GridViewDataColumn FieldName="Name" Caption="Name">
            </dx:GridViewDataColumn>
            <dx:GridViewDataColumn FieldName="Count" Caption="Count">
            </dx:GridViewDataColumn>
        </Columns>
    </dx:ASPxGridView>
    <dx:ASPxButton ID="btnTest" runat="server" Text="保存">
        <ClientSideEvents Click="function(s, e){
                        clb.PerformCallback(GetSaveData());
                        e.processOnServer = false;
        }" />
    </dx:ASPxButton>
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
    应用程序页
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea"
    runat="server">
    我的应用程序页
</asp:Content>

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.ASPxGridView;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using DevExpress.Web.ASPxCallback;

namespace PlanTest.Layouts.PlanTest
{
    public partial class GridPlan : LayoutsPageBase
    {
        TestEntities ent = new TestEntities();
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void gdv_OnLoad(object sender, EventArgs e)
        {
            int weekCount = 5;
            string startDate = "2013/7/26";
            string[] weeks = GetDatequantumList(weekCount, startDate);
            gdv.DataSource = GetDataTable(weeks);
            if (!IsPostBack && !IsCallback)
            {
                PopulateColumns(weeks);
                gdv.DataBind();
            }
            else
            {
                CreateTemplate(weeks);
            }
        }

        private object GetDataTable(string[] weeks)
        {
            string colNames = string.Empty;// "ID,";
            DataTable table = ent.InfoList.ToDataTable();
            for (int i = 0; i < weeks.Length; i++)
            {
                table.Columns.Add(weeks[i], typeof(string));
                colNames += weeks[i] + ",";
            }
            colNames = colNames.TrimEnd(',');
            hdl.Set("colNames", colNames);
            foreach (DataRow row in table.Rows)
            {
                int id = Convert.ToInt32(row["ID"]);
                List<Plan> plans = ent.Plan.Where(p => p.InfoList.ID == id).ToList();
                for (int j = 0; j < weeks.Length; j++)
                {
                    //字段的值保存id和value的对应关系
                    row[weeks[j]] = plans[j].Count + "|" + plans[j].ID;
                }
            }
            return table;
        }

        public void PopulateColumns(string[] weeks)
        {
            GridViewBandColumn bandColumn = new GridViewBandColumn();
            bandColumn.Caption = "测试";
            for (int i = 0; i < weeks.Length; i++)
            {
                GridViewDataTextColumn colItemTemplate = new GridViewDataTextColumn();
                colItemTemplate.DataItemTemplate = new MyTextTemplate(); // Create a template
                colItemTemplate.FieldName = weeks[i];
                colItemTemplate.Caption = weeks[i];
                bandColumn.Columns.Add(colItemTemplate);
            }
            gdv.Columns.Add(bandColumn);
        }

        private void CreateTemplate(string[] weeks)
        {
            for (int i = 0; i < weeks.Length; i++)
            {
                ((GridViewDataColumn)gdv.Columns[weeks[i]]).DataItemTemplate = new MyTextTemplate();
            }
        }

        protected void clb_OnCallback(object source, CallbackEventArgs e)
        {
            try
            {
                string[] newValues = e.Parameter.TrimEnd('|').Split('|');
                foreach (string newValue in newValues)
                {
                    int workload = Convert.ToInt32(newValue.Substring(0, newValue.IndexOf('&')));
                    int planID = Convert.ToInt32(newValue.Substring(newValue.IndexOf('&') + 1));
                    Plan plan = ent.Plan.Where(p => p.ID == planID).FirstOrDefault();
                    if (plan != null)
                    {
                        plan.Count = workload;
                    }
                }
                ent.SaveChanges();
                e.Result = "1";
            }
            catch
            {
                e.Result = "0";
            }
        }
    }

    class MyTextTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            using (GridViewDataItemTemplateContainer gridContainer = (GridViewDataItemTemplateContainer)container)
            {
                string fieldValue = gridContainer.Grid.GetRowValuesByKeyValue(gridContainer.KeyValue, gridContainer.Column.FieldName).ToString();
                ASPxTextBox txt = new ASPxTextBox();
                txt.Width = 46;
                txt.Text = fieldValue.Substring(0, fieldValue.IndexOf("|"));
                txt.JSProperties["cpID"] = fieldValue.Substring(fieldValue.IndexOf("|") + 1);
                txt.ClientInstanceName = "txt" + gridContainer.KeyValue.ToString() + gridContainer.Column.FieldName;
                txt.DisplayFormatString = "F2";
                container.Controls.Add(txt);
            }
        }
    }
}


Above is almost full code what I did for test. It mainly used in the situation of making plans, which user can complete the plan of multiple work at one time.

All rights reserved

原文地址:https://www.cnblogs.com/justinliu/p/5961705.html