我有一个GridView
,其中包含一些BoundFields
和两个TemplateFields
。在这两个TemplateFields
中,我动态创建UserControls
,其中包含DropDownList
和TextBox
,用户可以修改这些内容。
当我尝试在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
但我得到的错误是它不存在。
答案 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
}
}
效果很好