asp.net动态添加GridView的模板列,并获取列值

it2022-06-23  81

一、动态添加模板列:

1、建立模板列样式:

说明:下边代码可以直接写在aspx文件中,也可以单独建立cs文件;另外,我没有写button、linkButton等控件,意思差不多,不过当需要添加事件时,记得将事件名称传入,并附加在控件上

public class GridViewTemplate : ITemplate{ /// <summary> /// 模板类型:标题或内容; /// DataControlRowType.Header和DataControlRowType.DataRow /// </summary> private DataControlRowType P_TemplateType; /// <summary> /// 列的名称:列标题时,为列显示名称;列内容时,为列的字段名称 /// </summary> private string P_ColumnName; /// <summary> /// 列的类型:TextBox、DropDownList等 /// </summary> private string P_ColumnType;

public GridViewTemplate() { // //TODO: 在此处添加构造函数逻辑 // } /// <summary> /// 构造函数:动态添加模版列 /// </summary> /// <param name="TemplateType">模板类型:标题或内容;DataControlRowType.Header和DataControlRowType.DataRow</param> /// <param name="ColumnName">列的名称:列标题时,为列显示名称;列内容时,为列的字段名称</param> /// <param name="ColumnType">列的类型:列标题时,可为空;列内容时,为模板列的控件类型</param> public GridViewTemplate(DataControlRowType TemplateType, string ColumnName, string ColumnType) { P_TemplateType = TemplateType; P_ColumnName = ColumnName; P_ColumnType = ColumnType; } public void InstantiateIn(System.Web.UI.Control container) { switch (P_TemplateType) { case DataControlRowType.Header://列标题 Literal lc = new Literal(); lc.Text = P_ColumnName; container.Controls.Add(lc); break; case DataControlRowType.DataRow://模版列内容

if (P_ColumnType.ToUpper() == "TextBox".ToUpper()) { TextBox tb = new TextBox(); tb.ID = "txt_" + P_ColumnName; tb.AutoPostBack = true; tb.EnableViewState = true; //tb.Text = ""; tb.DataBinding += new EventHandler(tb_DataBinding); container.Controls.Add(tb); } else if (P_ColumnType.ToUpper() == "Label".ToUpper()) { System.Web.UI.WebControls.Label lb = new Label(); lb.ID = "lbl_" + P_ColumnName; lb.EnableViewState = true; //tb.Text = ""; lb.DataBinding += new EventHandler(lb_DataBinding); container.Controls.Add(lb); } else { //默认为TextBox TextBox tb = new TextBox(); tb.ID = "txt_" + P_ColumnName; tb.AutoPostBack = true; tb.EnableViewState = true; tb.DataBinding += new EventHandler(tb_DataBinding); container.Controls.Add(tb); }

 

break; default: break; } } void tb_DataBinding(object sender, EventArgs e) { TextBox txtdata = (TextBox)sender; GridViewRow container = (GridViewRow)txtdata.NamingContainer; object dataValue = DataBinder.Eval(container.DataItem, P_ColumnName); if (dataValue != DBNull.Value) { txtdata.Text = dataValue.ToString(); } } void lb_DataBinding(object sender, EventArgs e) { Label lbldata = (Label)sender; GridViewRow container = (GridViewRow)lbldata.NamingContainer; object dataValue = DataBinder.Eval(container.DataItem, P_ColumnName); if (dataValue != DBNull.Value) { lbldata.Text = dataValue.ToString(); } }

}

2、前台aspx文件:

<asp:GridView ID="gvData" runat="server" SkinID="GridView" Width="100%" UseAccessibleHeader="False" AutoGenerateColumns="False"  AllowPaging="True" PageSize="100" οnlοad="gvData_Load" > <PagerSettings Visible="False" /> <HeaderStyle Font-Bold="True" /> </asp:GridView>

3、aspx.cs文件--创建GridView,并绑定数据:

说明:dt是外部获取的数据,我是根据数据表,动态生成GridView,并赋值

private void CreateDT(DataTable dt) {

this.gvData.Columns.Clear();

TemplateField customField = new TemplateField();

for (int i = 0; i < dt.Columns.Count; i++) { customField = new TemplateField(); customField.ShowHeader = true; customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, dt.Columns[i].ColumnName, ""); customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, dt.Columns[i].ColumnName, "TextBox"); ViewState["txt_" + dt.Columns[i].ColumnName] = true; gvData.Columns.Add(customField); }

//绑定数据

this.gvData.DataSource = dt; this.gvData.DataBind();

}

4、aspx.cs文件:重复建立并绑定数据,因为动态生成控件时,只要有刷新,所有的动态控件就全部消失,所以需要每次刷新都要重新绑定一次;

另外,我试过在OnInit、gvData_Init等事件中执行建立并绑定数据的操作,都可以实现,但是对于我不大适用,因为我是根据TreeView的选中项,来创建绑定GridView的;其他事件执行时机靠前,无法获取TreeView的选中项是哪个,而gvData_Load事件可以(虽然该事件也是在TreeView选中事件前执行,不过并不影响选中项的变化和获取到的内容)

protected void gvData_Load(object sender, EventArgs e) {DataTable dt=GetData();CreateDT(dt); }

5、aspx.cs文件:点击按钮,获取前台修改过的gvData中模板列的数据:

说明:我的保存时,先将数据保存进ViewState["DtData"]后,再执行保存功能;这么做是因为别的页面的问题,需要获取后,再刷新;不过大致意思都是相同的

注意:也可以使用TextBox txt= (TextBox)gvData.Rows[i].FindControl("txt_"+dtData.Columns[j].ColumnName);获取

private void SaveToTable() {

DataTable dtData = (DataTable)ViewState["DtData"]; for (int i = 0; i < this.gvData.Rows.Count; i++) { for (int j = 0; j < dtData.Columns.Count; j++) {

string txtName = "gvData$ctl" + (i + 2).ToString().PadLeft(2, '0') + "$txt_" + dtData.Columns[j].ColumnName; if (Request.Form[txtName] != null) {//目前仅能通过这个判断 dtData.Rows[i][j] = Request.Form[txtName]; JsService.ResponseMessage(this.UpdatePanel1, this.GetType(), "txtName:" + txtName + "----" + Request.Form[txtName]); break; }

}

}

ViewState["DtData"] = dtData;

}

 

6、实际上最主要的再gvData_Load事件中重复的动态创建并获取数据.

转载于:https://www.cnblogs.com/jiutianxingchen/p/5520844.html

相关资源:ASP.NET GridView 动态添加模板列示例

最新回复(0)