我有一个带有一些BoundFields和两个TemplateFields的GridView.在这两个TemplateFields中,我动态创建包含DropDownList和TextBox的UserControls,用户可以修改它们.
当我尝试在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
但我得到它不存在的错误.
解决方法
您应该在
RowCreated而不是
RowDataBound中创建动态控件,因为此事件会在每次回发时触发,而RowDataBound仅在GridView获取数据绑定到其DataSource时触发.
必须在每个回发上重新创建动态创建的控件,并使用与之前相同的ID,然后将它们保留在ViewState中,并且事件将正确触发(例如,DropDownList的SelectedIndexChanged事件).
所以你应该在RowCreated中创建它们并在RowDataBound中“填充”它们(例如,DropDownList数据源/ Items或TextBox-Text).