zoukankan      html  css  js  c++  java
  • asp.net动态添加GridView的模板列,并获取列值

    一、动态添加模板列:

    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" onload="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事件中重复的动态创建并获取数据.

  • 相关阅读:
    MySQL分库分表环境下全局ID生成方案
    机器码和字节码
    Java程序编译和运行的过程
    hive大数据倾斜总结
    图解MapReduceMapReduce整体流程图
    Java中的5种同步辅助类
    Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
    RocketMQ与Kafka对比(18项差异)评价版
    ENode 2.0
    SecureCrt的操持连接办法
  • 原文地址:https://www.cnblogs.com/jiutianxingchen/p/5520844.html
Copyright © 2011-2022 走看看