0
我需要生成包含基於存儲在數據庫中的數據複選框列(該網格可以有不同數量的每月列)如何讀取自定義模板控件的代碼後面加
我有了這個代碼與我的網格控件的自定義模板:
ASPX部分:
<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>
* 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
}
}
CustomItemTemplate.cs
public class CustomItemTemplate : ITemplate
{
private readonly ListItemType _type;
private readonly string _columnName;
public ItemTemplateGenerator(ListItemType t, string columnName)
{
_type = t;
_columnName = columnName;
}
// Override InstantiateIn() method
void ITemplate.InstantiateIn(Control container)
{
switch (_type)
{
case ListItemType.Item:
var visibleCheckbox = new CheckBox
{
ID = $"chb_{_columnName.Replace(":", "_")}_visible"
};
visibleCheckbox.DataBinding += VisibleCheckbox_DataBinding;
var invisibleField = new HiddenField
{
ID = $"chb_{_columnName.Replace(":", "_")}_invisible"
};
var hiddenInput = new HiddenField
{
ID = $"hidden_time",
Value = _columnName
};
container.Controls.Clear();
container.Controls.Add(hiddenInput);
container.Controls.Add(visibleCheckbox);
container.Controls.Add(invisibleField);
break;
}
}
// The DataBinding event of your controls
private void VisibleCheckbox_DataBinding(object sender, EventArgs e)
{
var checkBox = (CheckBox)sender;
var container = (GridViewRow)checkBox.NamingContainer;
var hiddenField = (HiddenField)checkBox.NamingContainer.FindControl($"chb_{_columnName.Replace(":","_")}_invisible");
var bindValue = DataBinder.Eval(container.DataItem, _columnName);
// Adding check in case Column allows null values
if (bindValue != DBNull.Value)
{
hiddenField.Value = bindValue.ToString();
checkBox.Checked = bindValue.ToString() == "1";
}
}
}
所以,問題是我應該怎麼做這個 「的FindControl」,以獲得適當的領域,而不是空?
如果您需要更多詳細信息,請直接詢問。