2011-10-05 50 views
8

我有一个GridView与一些BoundFields和两个TemplateFields。在这两个TemplateFields中,我动态地创建了包含DropDownListTextBoxUserControls,用户可以对其进行修改。动态列在回发后消失

当我试图获得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 

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

回答

8

你应该RowCreated而不是RowDataBound创建动态控件,因为这个事件得到每个回发而RowDataBoundGridView被数据绑定到它的DataSource只会火射击。

动态创建的控件必须在每次回发时重新创建,其ID与以前相同,然后它们保留其值ViewState并且事件将正确触发(例如DropDownList的SelectedIndexChanged事件)。

所以,你应该在RowCreated创建它们和RowDataBound“补”他们指标(如在DropDownList数据源/项或TextBox - 文本)。

+0

非常感谢!我仍然有一个问题,我有只读控件的专栏。并且这些控件的值在回发之后不会被检索。任何想法 ? – user874854

+0

@ user874854:'readonly'控件不保留ViewState中客户端的更改(仅在服务器端进行更改)。通过[Attributes](http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.webcontrol.attributes.aspx)集合使其成为'readonly',例如:'TextBox1.Attributes 。新增( “只读”, “只读”);'。在这种方式你愚弄ASP.NET。看看[这里](http://www.codeproject.com/KB/aspnet/Readonly.aspx)了解更多信息。 –

0

我一直在使用:

EnableViewState="false" 
GridView属性

。删除它解决了我的问题!