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