2012-08-13 68 views
1

为什么当我尝试使用会话状态设置我的GridView排序时,突然间我的GridView不再有DataKeys?我所做的只是将下面的代码放入我的Page_Init中;GridView丢失DataKeys

Dim SortDirection As String = Session("SortDir") 
Dim sortExpression As String = Session("SortExp") 
If Not SortDirection Is Nothing AndAlso Not sortExpression Is Nothing Then 
    If (SortDirection = "asc") Then 
     GridView1.Sort(sortExpression, WebControls.SortDirection.Ascending) 
    Else 
     GridView1.Sort(sortExpression, WebControls.SortDirection.Descending) 
    End If 
End If 

但如果我评论了这一点比我的其他方法不碰撞出更多的为我的GridView现在有它的DataKeys。为什么是这样?

UPDATE

这是停止工作时,上面的代码是在适当位置中的特定行。

Dim UserID = GridView1.DataKeys(e.RowIndex).Value.ToString 

根据调试器GridView1有列但它的DataKeys计数是0.我收到的错误是;

Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 
+0

什么是你的错误,当你其他的方法崩溃?你正在执行哪些操作会导致错误? – jadarnel27 2012-08-13 15:10:45

+0

@ jadarnel27请参阅更新。 – windowskm 2012-08-13 15:18:20

+0

感谢您添加额外信息! – jadarnel27 2012-08-13 15:22:20

回答

2

要执行的Page_Load这些行动(可能在If Not Page.IsPostBack块)事件,而不是在Page_Init事件。初始化为初始化读取控制属性;加载是你一般设置属性(如排序方向等)。

基本上,您的ViewState尚未在Page_Init中加载。因此,您修改Init中的控件属性,然后会从ViewState中填写一些属性,并且当页面执行Load事件(递归调用每个服务器控件的Load事件)时,这会导致意外的行为。

您可以阅读所有关于MSDN上这个(有点混乱)主题:ASP.NET Page Life Cycle Overview

+0

让它在Page_Load事件中引起了一些令人困惑的行为(也尝试过更糟糕的PreRender)。将它放回到Page_Load中,并带上“If Not Page.IsPostBack”,现在效果更好。非常感谢!! – windowskm 2012-08-13 15:25:32

+0

@killianmcc没问题,很高兴我能帮忙。如果“不是Page.IsPostBack”块导致代码只运行一次(页面加载第一次),而不是每次将页面回发到服务器。 – jadarnel27 2012-08-13 15:27:46