在asp.net中回发后,GridView(复选框)中动态添加的控件消失

时间:2019-01-29 09:06:41

标签: c# asp.net gridview postback

我在网格视图列中添加了一个动态创建复选框,但是单击按钮后它为我提供了空值。

此复选框在回发后消失。

这是我的代码

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)
        {
        }
    }
}

2 个答案:

答案 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";