- PR -

DataGridのフィルタリング

1
投稿者投稿内容
やんもり
会議室デビュー日: 2003/07/04
投稿数: 13
投稿日時: 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 ]
聖人@SKB
ベテラン
会議室デビュー日: 2003/03/26
投稿数: 58
お住まい・勤務地: 横浜(MM21)勤務の筈だがいつも顧客先常駐
投稿日時: 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/04
投稿数: 13
投稿日時: 2003-07-16 15:37
聖人さん、コードを試していただきありがとうございました。

フィルタリングがうまくいったということで、再度私の方でも
確認してみたのですが、以下の様な状況です。

1.DataGridのプロパティビルダにて、[全般]のデータソースに
  「DataSet31」を連結せずに実行すると、Page_Load時には
  何も表示されず、Botton1をクリックすると、フィルタリング
  された結果が表示されます。

2.上記プロパティビルダにて「DataSet31」を連結すると、
  Page_Load時に一覧表示されますが、Botton1をクリック
  しても、表示内容に変化がありません。

1.でフィルタリングできることは確認できたので、聖人さん
ご指摘のPostBackが絡んでいるように思えるのですが、
どう修正すれば、Page_Load時に一覧表示して、Botton1クリック時
にフィルタリングされるようになるのか、もう少しアドバイス
いただけないでしょうか。
聖人@SKB
ベテラン
会議室デビュー日: 2003/03/26
投稿数: 58
お住まい・勤務地: 横浜(MM21)勤務の筈だがいつも顧客先常駐
投稿日時: 2003-07-16 17:37
初回に一覧表示されないのは Page_Loadの部分に
DataSource = DataSet31
がないからです。

DataGridにこのデータソース(DataSource)を割り当てるよ,
と宣言しておき,DataBindでデータを持ってくると考えてください。

プロパティビルダにてデータソースを設定した場合に一覧表示され,
プロパティビルダにてデータソースを設定しなかった場合に一覧表示されないのは
そのためです。

※全然期待値と異なる回答をしてました。暴走してました。
やんもり
会議室デビュー日: 2003/07/04
投稿数: 13
投稿日時: 2003-07-16 18:47
早速のご教授ありがとうございました。

連結を外し、Page_Loadの部分を
If IsPostBack = False Then
  SqlDataAdapter1.Fill(DataSet31)
  DataGrid1.DataSource = DataSet31
  DataGrid1.DataBind()
End If
と書くことにより、やりたいことは実現できるように
なりました。

ただ、DataGridのプロパティビルダで連結してしまうと、
出来なくなるのは何故なんでしょう・・・?
(コードのどこかが変更されているのでしょうか?)

今のやり方は、プロパティビルダで一旦DataSetを連結し
[列]タブにて、必要な列を指定し、再度[全般]タブに
戻って連結を外すという何か回りくどいやり方です。
(これで、デザイナでは、見出しがテーブルの列名に変更され、
 各セルには「データバインド」と表示されている状態です。)

初心者なので、できるだけウィザードやプロパティに頼りたい
気持ちがあるのですが、実際の動きや仕組みを理解しないと、
なかなか使いこなせないものなのでしょうか・・・
1

スキルアップ/キャリアアップ(JOB@IT)