我需要根据存储在数据库中的数据生成包含复选框的列(此网格每月可以包含不同数量的列)
我的网格视图控件上有自定义模板的代码:
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?
如果您需要更多详情,请询问。
答案 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 ...
}
}
}
}