2011-01-27 42 views
2

我有一個gridview,我與一個列表中的linq查詢的結果綁定。數據源在GridView中爲空

<asp:GridView ID="MyGrid" AllowSorting="True" OnSorting="SortMyGrid"> 

在後面的代碼,我有事件處理程序設置是這樣的:在背後說我的代碼,然後我在GridView與列表

MyGrid.DataSource = MyList; 
MyGrid.DataBind(); 

我也有排序啓用網格綁定:

protected void MyGrid(object sender, GridViewSortEventArgs e) 
{ 
    var NewDataSource = from d in MyList 
       orderby e.SortExpression 
       select d; 
} 

現在的問題是,當事件處理程序接管時MyList爲null!我正在跟蹤它,並且我看到它加載得很好,我看到網頁上的gridview具有正確的數據,但只要單擊列標題對網格進行排序,MyList就會變爲null!爲什麼??是什麼導致了這個問題?

回答

5

一旦你的數據被綁定,源在下一個事件中被有效地「丟失」。如果需要保留它,可以將它放在會話中,並在需要時將其拉出。

編輯 那麼,'失去'這個詞聽起來很刺耳,但它不再被引用。無論你有對它的引用(頁面加載,最有可能的),你可以這樣做:

MyGrid.DataSource = MyList; 
MyGrid.DataBind(); 
Session["MyList"] = MyList; 

然後,在你的事件處理程序(當你再次需要它),把它背出來:

List<MyObjectType> MyList = Session["MyList"] as List<MyObjectType>; 

其中List<MyObjectType>是您的列表類型。 Session基本上是一個字典,這就是爲什麼你可以存儲任何東西,但你必須把它放在出路。

+0

真的嗎?丟失?我如何在會話中列出該列表?對不起,我是新來的框架。 – frenchie 2011-01-27 21:45:27

+0

好的,謝謝澄清。什麼一拖!我只是想知道,在頁面呈現後不保留變量的值是否有任何好處?爲什麼框架以這種方式構建,其中變量需要傳遞給另一個對象,而不是讓變量自動保存它們的值 – frenchie 2011-01-27 22:07:44

1
protected void MyGrid(object sender, GridViewSortEventArgs e) 
    { 
     var NewDataSource = from d in MyList 
        orderby e.SortExpression 
        select d; 

      MyGrid.DataSource = NewDataSource; 
      MyGrid.DataBind(); 
    }