如何从自定义模板中读取控件添加后面的代码

时间:2017-08-08 07:45:35

标签: c# asp.net webforms

我需要根据存储在数据库中的数据生成包含复选框的列(此网格每月可以包含不同数量的列)

我的网格视图控件上有自定义模板的代码:

aspx部分:

destinationImage

* cs:

        <asp:Button runat="server" ID="bt_save_top" OnClick="bt_save_Click" Text="Save" />
        <asp:GridView runat="server" ID="gv_result" AutoGenerateColumns="false" BorderStyle="Solid" BorderWidth="1" RowStyle-BorderWidth="1" RowStyle-BorderStyle="Solid">
        </asp:GridView>

CustomItemTemplate.cs

    protected void Page_Load(object sender, EventArgs e)
    {

        var ds = new DataSet();//getting data from database
        var weekDayColumns = GenerateColumns(ds);
        foreach (DataControlField dataControlField in weekDayColumns)
        {
            gv_result_tw.Columns.Add(dataControlField);
        }
        gv_result_tw.DataSource = ds.Tables[0];
        gv_result_tw.DataBind();
    }
    private DataControlFieldCollection GenerateColumns(DataSet dsTable)
    {
        var columns = new DataControlFieldCollection();
        foreach (DataColumn column in dsTable.Tables[0].Columns)
        {
            var itemTemplate = new TemplateField
            {
                HeaderText = column.Caption,
                ControlStyle =
                {
                    CssClass = "gv_row"
                },
                HeaderStyle =
                {
                    CssClass = "gv_row"
                },
                ItemTemplate = new CustomItemTemplate(ListItemType.Item, column.ColumnName)
            };
            columns.Add(itemTemplate);
        }

        return columns;
   }

    protected void bt_save_Click(object sender, EventArgs e)
    {
         foreach(var row in gv_result_tw.Rows) 
         {
              var columnNameField = gvr.FindControl("hidden_time") as HiddenField; 
             // Here i'm getting always null
         }
    }

所以问题是我应该如何做到这一点&#34; FindControl&#34;得到适当的字段而不是null?

如果您需要更多详情,请询问。

1 个答案:

答案 0 :(得分:0)

您必须进行两项更改,一次是在CustomItemTemplate的InstantiateIn实现中,因此容器也会获取ID。在这种情况下,我选择了_columnName

的值
public class CustomItemTemplate : ITemplate
{
    // stuff omitted for brevity     

    // Override InstantiateIn() method
    void ITemplate.InstantiateIn(Control container)
    {
        // set the ID of the container these fields are in!
        container.ID = _columnName;
        // rest of your code
        // make sure hidden_time is still unique!
        var hiddenInput = new HiddenField
            {
                ID = $"{_columnName.Replace(":", "_")}_hidden_time",
                Value = _columnName
            };
    }
}

然后,您的按钮单击实现可以在其启动时利用该ID来查找控件:

protected void bt_save_Click(object sender, EventArgs e)
{
    // a GridViewRow has cells ...
    foreach (GridViewRow row in gv_result_tw.Rows)
    {
        // ... the cells are of type DataControlFieldCell
        foreach (DataControlFieldCell col in row.Cells)
        {
            // ... but we get some bonus fields as well 
            if (col.Controls.Count > 0)
            {
                // .. if we skip those 
                // ... we get a cell that has its ID set to the value
                // that was used to generate the ID of the hiddenfield
                var columnNameField = row.FindControl(col.ID + "_hidden_time") as HiddenField;
               // columnNameField will not be null now ...
            }
        }
    }
}