我在网格视图列中添加了一个动态创建复选框,但是单击按钮后它为我提供了空值。
此复选框在回发后消失。
这是我的代码
protected void grdreport_RowDataBound(object sender, GridViewRowEventArgs e)
{
int temp = e.Row.Cells.Count;
temp--;
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (temp >= 3)
{
strheadertext1 = grdreport.HeaderRow.Cells[3].Text;
CheckBox cb1 = new CheckBox();
cb1.Text = e.Row.Cells[3].Text;
e.Row.Cells[3].Controls.Add(cb1);
}
}
}
然后在我的按钮上单击我选中复选框的值所在的位置
foreach (GridViewRow item in grdreport.Rows)
{
if (item.RowType == DataControlRowType.DataRow)
{
CheckBox checkbox1 = (CheckBox)item.FindControl("cb1");
// cb1.Checked = true;
if (checkbox1.Checked)
{
}
}
}
答案 0 :(得分:1)
为了在回发期间访问动态创建的控件的值,您需要在OnInit
方法中使用相同的ID重新创建控件。在极少数情况下,有必要这样做或证明为完成这项工作而必须付出的努力是正确的-特别是在涉及列表或网格的情况下。
话虽这么说,但您可以使用一些替代方法来仅显示某些项目的复选框。一种想法是添加一个普通的复选框列(或在更复杂的情况下添加一个模板列)。使用代码或CSS在您不想看到该复选框的行中隐藏该复选框。因此该对象将在那里,但用户不会在隐藏该对象的行中看到它。这通常比动态方法容易得多。
答案 1 :(得分:1)
使用动态控件时,您需要在每个PostBack上重新绑定GridView数据。因此,通常您将使用IsPostBack检查并在那里绑定数据。但现在不要这样做。
protected void Page_Load(object sender, EventArgs e)
{
//normally you would bind here
if (IsPostBack == false)
{
GridView1.DataSource = source;
GridView1.DataBind();
}
//but when using dynamic control inside a gridview, bind here
GridView1.DataSource = source;
GridView1.DataBind();
}
更新
并且您必须给动态控件一个ID。您正在寻找cb1
,但从未将该ID分配给该复选框。
CheckBox cb1 = new CheckBox();
cb1.ID = "cb1";