投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/8 13:18:27
> 新たにセットしてSQLで構文をかいてTableDataGridViewにセットするのでしょうか?

そういう方法を取ることもできますが、既に DataTable にデータを抽出済みであれば、
そこから絞り込むという手も使えます。

既に DataSet/DataTable に取得済みの内容のうち、一部の行だけを表示させたい場合には、
BindingSource の Filter プロパティ あるいは DataView の RowFilter プロパティを使います。

たとえば、数学または英語が赤点だった生徒を列挙するために
 BindingSource1.Filter = "数学<=40 OR 英語<=40"
のように記述することができます。

ソートやフィルター、イベント処理などの制御が必要な場合には、
DataGridView1.DataSource に指定するのは、DataSet や DataTable ではなく、
BindingSource もしくは DataView の方が扱いやすいと思います。
BindingSource はデザイン時に割り当てておくこともできます。
※BindingSource1 の DataSource に DataTable を割り当てておき、
※DataGridView1 の DataSource に、BindingSource1を割り当てるようにする。

Visual Studio のサーバーエクスプローラーからドラッグ & ドロップで
フォームにテーブルを貼った場合も、DataGridView と共に BindingSource が貼られますね。


とはいえ、現在 BindingSource を現在使っておらず、
DataSource に DataSet や DataTable を直接割り当てていたとしても、
必ずしも BindingSource を使わなければいけないわけではありません

ソート処理やフィルター処理のためには、DataTable の DefaultView プロパティが返す
DataView オブジェクトの Sort / RowFilter プロパティを使って同じことができるためです。


なお、DataGridView の DataSource を用いている場合には、
> Data = Me.DataGridView1(c.ColumnIndex, c.RowIndex).Value
のような、行番号・列番号に依存したコードを書くことはお奨めしません。

列ヘッダーをクリックするなどしてソート処理を行うと、DataTable 上の行番号と
DataGridView 上の行番号は一致しなくなるためです。
このため、バインド元の DataRow を通じて読み書きする方が安全ですし、
パフォーマンスも向上します。

 For Each gridRow As DataGridViewRow In DataGridView1.Rows
  Dim rowView = DirectCast(row.DataBoundItem, DataViewRow)
  Dim row As DataRow = rowView.Row   '型付DataSetの場合は、型付DataRowで受け取れる 
    row("氏名") = "のの"



また、DataGridView 上で編集中の値は、他の行にカーソル移動するなどして
行データを確定するまでは、DataRow に反映されない事にも注意が必要です。