Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net中回发后,gridview中动态添加的控件(复选框)将消失_C#_Asp.net_Gridview_Postback - Fatal编程技术网

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

C# 在asp.net中回发后,gridview中动态添加的控件(复选框)将消失,c#,asp.net,gridview,postback,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) {

我在“网格视图”列中添加了一个“动态创建”复选框,但它在单击按钮时给了我空值

返回后,复选框将消失

这是我的密码

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

为了在回发期间访问动态创建的控件的值,需要在
OnInit
方法中使用相同的ID重新创建控件。很少有情况下,这是必要的,或者可以证明您必须付出努力来实现这一点,特别是在涉及列表或网格的场景中


也就是说,您可以使用一些选项仅显示某些项目的复选框。一个想法是添加一个普通复选框列(或者对于更复杂的场景,添加一个模板列)。使用代码或CSS在不希望看到复选框的行中隐藏复选框。因此对象将在那里,但用户不会在隐藏的行中看到它。这通常比动态方法容易得多

为了在回发期间访问动态创建的控件的值,需要在
OnInit
方法中使用相同的ID重新创建控件。很少有情况下,这是必要的,或者可以证明您必须付出努力来实现这一点,特别是在涉及列表或网格的场景中


也就是说,您可以使用一些选项仅显示某些项目的复选框。一个想法是添加一个普通复选框列(或者对于更复杂的场景,添加一个模板列)。使用代码或CSS在不希望看到复选框的行中隐藏复选框。因此对象将在那里,但用户不会在隐藏的行中看到它。这通常比动态方法容易得多

使用动态控件时,需要在每次回发时重新绑定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";

使用动态控件时,需要在每次回发时重新绑定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";

仍然复选框有空值@vdwwdthanks@VDWWD其工作正常,但新问题出现在按钮上单击i获取行项目的值它总是在我选中第二行foreach的复选框时给出第一行值(grdreport.Rows中的GridViewRow){checkbox checkbox1=(checkbox)row.FindControl(“cb1”);checkbox1.Checked=true;如果(checkbox1.Checked){string itemname=row.Cells[0]。Text;string special=row.Cells[1]。Text;string qty=row.Cells[2]。Text;}}}}您正在循环所有行,因此,您必须确保获得正确的行。如何获得检查行@vdwwdstrill复选框的空值@vdwwdtanks@VDWWD其工作正常,但在按钮单击时出现新问题我获取行项目的值每当我选中第二行foreach的复选框(gridreport.Rows中的GridViewRow行)时,它总是给出第一行值{CheckBox checkbox1=(CheckBox)row.FindControl(“cb1”);checkbox1.Checked=true;if(checkbox1.Checked){string itemname=row.Cells[0]。Text;string special=row.Cells[1]。Text;string qty=row.Cells[2]。Text;}}'您正在循环所有行,因此必须确保获得正确的行。如何在@VDWWD获取该检查行