2011-01-27 2 views
2

リストにあるlinqクエリの結果をバインドするグリッドビューがあります。背後にあるコードではグリッドビューでnullになるデータソース

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

を、私は、イベントハンドラは次のように設定している:後ろの私のコードでは、私はその後、私はまた、有効にソートしてグリッドを持っているリスト

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

でのGridViewをバインド:

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

問題は、イベントハンドラが引き継がれたときにMyListがnullになることです。私はそれをトレースしていると私はそれが正常にロードされた参照してください、私は正しいデータでページ上のgridviewが表示されますが、私はグリッドを並べ替えるために列見出しをクリックすると、MyList nullに行く!なぜ??問題の原因は何ですか?

答えて

5

データがバインドされると、ソースは次のイベントで実質的に「失われます」。それを保持する必要がある場合は、セッションに入れて、必要に応じて引き出すことができます。

EDIT 「紛失」という用語は厳しいものですが、もはや参照されません。あなたは(ほとんどの場合、ページの読み込み、)それへの参照を持ってどこ、あなたがこれを行うことができます:あなたのイベントハンドラで、次に

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

を(あなたは再びそれを必要とするとき)、それを引き戻す:

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

ここで、List<MyObjectType>はあなたのリストのタイプです。 Sessionは基本的に辞書なので、何かを保存することができますが、途中でキャストする必要があります。

+0

実際には?失われた?リストをセッションに入れるにはどうしたらいいですか?申し訳ありませんが、私はフレームワークを初めて使っています。 – frenchie

+0

確認していただきありがとうございます。どのようなドラッグ!私はちょうど、ページがレンダリングされた後に変数の値を保持しないための利点はありますか?変数がその値を自動的に保持するのではなく、別のオブジェクトに変数を渡す必要がある場合に、フレームワークがこのように構築されるのはなぜですか? – frenchie

+0

@frenchie:これはなぜ実際にはわかりませんが、 - )。私はそれがデータの重複を取り除くと思います。データバインディングの行為は、グリッド内のセル値にデータを変換するので、これが完了すると、DataSourceプロパティは空になります。これはただの推測です:-)。 –

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

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

問題は、MyListがnullであることです。 – frenchie

関連する問題