回发后动态列消失

时间:2011-10-05 07:31:34

标签: asp.net gridview controls postback

我有一个GridView,其中包含一些BoundFields和两个TemplateFields。在这两个TemplateFields中,我动态创建UserControls,其中包含DropDownListTextBox,用户可以修改这些内容。

当我尝试在PostBack之后获取控件的值时,BoundFields中的值仍然存在,但我的动态控件消失了。我可以再次创建它们但它不会获得用户的值...如何在丢失之前获取这些值?

以下是我的一些代码:

RowDataBound活动中:

Select Case type
    Case "BooleanBis"
        e.Row.Cells(2).Controls.Clear()
        Dim list1 As BooleanBisList = New BooleanBisList(avant, False)
        e.Row.Cells(2).Controls.Add(list1)

        e.Row.Cells(4).Controls.Clear()
        Dim list2 As BooleanBisList = New BooleanBisList(apres, True)
        e.Row.Cells(4).Controls.Add(list2)
    Case "Boolean"
        e.Row.Cells(2).Controls.Clear()
        Dim list3 As BooleanList = New BooleanList(avant, False)
        e.Row.Cells(2).Controls.Add(list3)

        e.Row.Cells(4).Controls.Clear()
        Dim list4 As BooleanList = New BooleanList(apres, True)
        e.Row.Cells(4).Controls.Add(list4)
End Select

在我的按钮点击事件中,我尝试获取用户控件:

Case "String"
    temp.ChampValeurApres = DirectCast(Tableau1.Rows(i).Cells(selectedColumn).Controls(1), TextBox).Text

但我得到的错误是它不存在。

3 个答案:

答案 0 :(得分:8)

您应该在RowCreated而不是RowDataBound中创建动态控件,因为此事件会在每次回发时触发,而RowDataBound仅在GridView数据绑定到DataSource时触发{1}}。

必须在每个回发上重新创建动态创建的控件,并使用与之前相同的ID,然后将它们的值保留在ViewState中,并且事件将正确触发(对于DropDownList的SelectedIndexChanged事件)。

因此,您应该在RowCreated中创建它们并在RowDataBound中填充它们(对于DropDownList数据源/项目或TextBox - 文本)。

答案 1 :(得分:0)

我一直在使用:

EnableViewState="false"

GridView属性中。删除它解决了我的问题!

答案 2 :(得分:0)

我刚刚做了

protected void Page_Load(object sender, EventArgs e)
{
    if (!(Page.IsPostBack))
    {
        // Put the selected items which u want to keep on postback
    }
    else
    {
        //regenerate auto created controls
    }
}

效果很好