- - PR -
DataGridのフィルタリング
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-07-14 20:24
いつも勉強させていただいております。
DataGridにフィルタ機能を付加する方法について、 お力添えをいただければと思い投稿させていただきました。 Page_Loadにて一覧表示させたのち、DropDownListを 使って、絞り込み表示をさせようとしているのですが、 結果に変化が無く、うまく絞り込みできません。 (一覧表示は成功します。) 過去のスレッド等を参考に試しに以下のような簡単な サンプルを作ってみたのですが、これも同じ現象です。 何か基本的なところを誤っているように思うのですが、 どうすればうまくフィルタがかかるようになるのか ご教授いただければ幸いです。 ちなみに、サンプルのDBはNorthwindです。 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' ページを初期化する ユーザー コードをここに挿入します。 If IsPostBack = False Then SqlDataAdapter1.Fill(DataSet31) DataGrid1.DataBind() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SqlDataAdapter1.Fill(DataSet31) Dim dv As DataView = DataSet31.Tables("Products").DefaultView dv.RowFilter = "CategoryID = '2'" DataGrid1.DataSource = dv DataGrid1.DataBind() End Sub [ メッセージ編集済み 編集者: やんもり 編集日時 2003-07-14 20:25 ] |
|
投稿日時: 2003-07-16 14:44
ここに書かれているソースコードを試してみたのですが,
CategoryID が 2 のレコードのみ表示されました。 フィルタリング表示されます。 記事を読み直して思ったのですが, 「フィルタリング項目がリスト表示されたDropDownListを作成し, 選択された項目に対応してDataGridがフィルタリングされて再表示される」 ということをしたいのだが,サンプルを作って実行してみると 「DropDownListを変更してもDataGridに何ら変化が起きない」 ので困っている,ということでしょうか。 もしそうであれば,DropDownList変更時にPostBackされていないからだと思います。 DropDownListのAutoPostBackはデフォルトでFalseです。 対策として 方法その1: AutoPostBackをTrueにする 方法その2: Button等のPostBack時にSelectedChangedが処理されるようにする の何れかを実施してみて下さい。 DataGridは更新されるでしょう。 ※ ※質問と回答が噛みあっていない場合,この投稿は無視して下さい。 ※ |
|
投稿日時: 2003-07-16 15:37
聖人さん、コードを試していただきありがとうございました。
フィルタリングがうまくいったということで、再度私の方でも 確認してみたのですが、以下の様な状況です。 1.DataGridのプロパティビルダにて、[全般]のデータソースに 「DataSet31」を連結せずに実行すると、Page_Load時には 何も表示されず、Botton1をクリックすると、フィルタリング された結果が表示されます。 2.上記プロパティビルダにて「DataSet31」を連結すると、 Page_Load時に一覧表示されますが、Botton1をクリック しても、表示内容に変化がありません。 1.でフィルタリングできることは確認できたので、聖人さん ご指摘のPostBackが絡んでいるように思えるのですが、 どう修正すれば、Page_Load時に一覧表示して、Botton1クリック時 にフィルタリングされるようになるのか、もう少しアドバイス いただけないでしょうか。 |
|
投稿日時: 2003-07-16 17:37
初回に一覧表示されないのは Page_Loadの部分に
DataSource = DataSet31 がないからです。 DataGridにこのデータソース(DataSource)を割り当てるよ, と宣言しておき,DataBindでデータを持ってくると考えてください。 プロパティビルダにてデータソースを設定した場合に一覧表示され, プロパティビルダにてデータソースを設定しなかった場合に一覧表示されないのは そのためです。 ※全然期待値と異なる回答をしてました。暴走してました。 |
|
投稿日時: 2003-07-16 18:47
早速のご教授ありがとうございました。
連結を外し、Page_Loadの部分を If IsPostBack = False Then SqlDataAdapter1.Fill(DataSet31) DataGrid1.DataSource = DataSet31 DataGrid1.DataBind() End If と書くことにより、やりたいことは実現できるように なりました。 ただ、DataGridのプロパティビルダで連結してしまうと、 出来なくなるのは何故なんでしょう・・・? (コードのどこかが変更されているのでしょうか?) 今のやり方は、プロパティビルダで一旦DataSetを連結し [列]タブにて、必要な列を指定し、再度[全般]タブに 戻って連結を外すという何か回りくどいやり方です。 (これで、デザイナでは、見出しがテーブルの列名に変更され、 各セルには「データバインド」と表示されている状態です。) 初心者なので、できるだけウィザードやプロパティに頼りたい 気持ちがあるのですが、実際の動きや仕組みを理解しないと、 なかなか使いこなせないものなのでしょうか・・・ |
1