C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataGridViewとDataTableの順番の整合性


(過去ログ 121 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■72592 / inTopicNo.1)  DataGridViewとDataTableの順番の整合性
  
□投稿者/ りじこの (3回)-(2014/06/20(Fri) 16:54:24)

分類:[.NET 全般] 

DataGridViewとDataTableの行の順番の整合性を
合わせることはできないでしょうか。

DataGridViewにDataTableを食わせています。

Me.DataGridView1.DataSource = dt

グリッドに表示される。→OK
ソートをかける。
グリッド上の順番が入れ替わって表示される→OK
しかし、DataTableの順番は入れ替わらない。

グリッドで表示されている順番でDataTableの順番も
一緒に書き換えるようなメソッドはないものでしょうか。
引用返信 編集キー/
■72593 / inTopicNo.2)  Re[1]: DataGridViewとDataTableの順番の整合性
□投稿者/ Hongliang (205回)-(2014/06/20(Fri) 17:06:48)
DataTableは基本的に行の順番は問題としません。
DB上に行Aと行Bがどういう順番で格納されているか意識しないのと同じです。

DataGridViewに対してDataTableをDataSourceとした場合、実際にデータソースとして使用されるのはDataTableのDefaultViewプロパティで返されるDataViewオブジェクトになります。
DataViewはDataGridViewで実行したソートに従ってDataRowViewが並べ替えられます。
大体のことはDataTable自体ではなくこのDataViewを参照することで何とかなるのではないでしょうか。

それで不足なら、何故DataTableの行順を変更したいかというところをまず明らかにしないといけないかと思います。
引用返信 編集キー/
■72616 / inTopicNo.3)  Re[1]: DataGridViewとDataTableの順番の整合性
□投稿者/ 魔界の仮面弁士 (35回)-(2014/06/22(Sun) 19:51:38)
No72592 (りじこの さん) に返信
> Me.DataGridView1.DataSource = dt
> グリッド上の順番が入れ替わって表示される→OK
> しかし、DataTableの順番は入れ替わらない。

DataTable や DataSet を直接割り当てた場合、そのソート結果は、
DataTable.DefaultView に反映されています。DataTale の代わりに、
そちらを For Each にて列挙してみて下さい。
.DefaultView に影響を与えることを嫌うのであれば、別の DataView インスタンスを
DataSource に割り当てるか、BindingSource 経由で割り当てるようにすると良いでしょう。

あるいは、DataGridView の各行(DataGrieViewRow)を列挙して、それに対応する
バインド元の DataRow を拾う方法もあります。この場合も、グリッド上の順番通りに
DataRow を得ることができるでしょう。この場合の手順としては、DataGrieViewRow の
DataBoundItem プロパティから、DataRowView オブジェクトを得るようにし、さらに
その DataRowView の Row プロパティによって、バインド元の DataRow に辿りつけます。


> グリッドで表示されている順番でDataTableの順番も
> 一緒に書き換えるようなメソッドはないものでしょうか。
直接書き換えるというわけではありませんが、LINQ to DataSet を用いることによって、
任意の並び順あるいは絞り込みを行った結果を生成し、それを DataTable として
再構築することは可能です。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=10665
引用返信 編集キー/
■72632 / inTopicNo.4)  Re[2]: DataGridViewとDataTableの順番の整合性
□投稿者/ りじこの (4回)-(2014/07/01(Tue) 08:57:01)
(魔界の仮面弁士 さん)
/ Hongliang さん

お返事ありがとうございました。
先週サイトにアクセスできず返事が遅くなり
すみませんでした。

ご回答して頂いた内容で対応可能です。
ありがとうございます。
しかし
下記のような画面作成を考えていて
質問する経緯となりました。

2日ほどお返事お待ちして解決済みとします。

現在、担当者マスタの編集画面のようなものを考えており
フォームの左側にグリッドを配置
その右側に編集用のテキストボックス群を配置

グリッド上で選ばれた担当者の情報が
右側のテキストボックス群に表示され
編集登録できるようなものを考えております。


・選択行→テキストボックス表示において
   DataTable からテキストボックス
・テキストボックス→登録において
   テキストボックス→DataTable →データベース

のようなことを考えており
DataGridView系のプロパティは使用せず
DataTable 系のプロパティだけで
ソースコードを組めたら楽なのかなと
思って質問した次第です。

長文失礼いたしました。
読んでくださりありがとうございます。

引用返信 編集キー/
■72649 / inTopicNo.5)  Re[3]: DataGridViewとDataTableの順番の整合性
□投稿者/ 魔界の仮面弁士 (37回)-(2014/07/01(Tue) 15:18:35)
No72632 (りじこの さん) に返信
> グリッド上で選ばれた担当者の情報が
> 右側のテキストボックス群に表示され
> 編集登録できるようなものを考えております。

BindingSource を使えば、コーディングせずともデザイン時設定だけで構築できます。
左側のグリッドを選択したときに、自動的に右側の明細部にデータが読み込まれますよ。
(もちろん、デザイン時に割り当てず、実行時に自分でバインドしても OK)


[型付DataSet/型なしDataSet]
└[BindingSource]
 ├[DataGridView]のDataSourceプロパティ
 │
 └[TextBox]のTextプロパティに対して DataBindings
  http://msdn.microsoft.com/ja-jp/library/aa480734.aspx


この場合、「現在編集中の行」の情報は BindingSource によって管理されます。

「BindingSource1.Current」が返す DataRowView オブジェクトは、
「DataGridView1.CurrentRow.DataBoundItem」が返すものと同一であり、
『現在選択中のデータ行』を返します。ソートやフィルターとの併用も可能です。

また、このデータ行(DataRowView オブジェクト)の Row プロパティからは、
バインド元の DataTable の行(DataRow)を得られますので、
DataRow を直接操作することも可能です。



この手法では、DataGridViewの新行クリック時や、BindingSource.AddNew メソッド呼び出し時に、
「まだ DataTable には追加されていない、編集中状態の DataRow」が用意されます。


新規行を追加する場合や、既存行を編集する場合には、主キー情報や MaxLength 等が
適正値になっていないと、DataSet から制約例外が発せられてしまいますが、
この方法であれば、DataRow の内容チェックを行ってからデータが反映させることや、
AddingNew イベントを使って、新規行の列に対して規定値を用意することなどもできます。


なお入力値の確定は、DataGridView で別行に遷移するか、もしくは
BindingSource.EndEdit メソッドを実行することによって行われます。
その逆に、入力中のデータを破棄する場合は、BindingSource.CancelEdit メソッドです。



もちろん、BindingSource を使わず、各TextBox等とDataRowとの間の
データの読み書きを、自分で記述するという手法もあります。この場合、
DataGridView の現在行と、DataTable の行の関係については前回と今回の回答にて
記述したとおり、「DataRowView」を通じて行うことになります。


前者(テキストボックス等にデータバインドする場合)と、
後者(テキストボックスのデータを自分で読み書きする場合)とで、
どちらが良いのかはケースバイケースです。実際に簡単な実験プログラムを
作成し、両方のコーディング手法を試してみてください。
引用返信 編集キー/
■72652 / inTopicNo.6)  Re[4]: DataGridViewとDataTableの順番の整合性
□投稿者/ りじこの (5回)-(2014/07/01(Tue) 16:03:37)
No72649 (魔界の仮面弁士 さん) に返信

ご回答ありがとうございます。
BindingSourceなかなか高機能なメソッドですね。
教えて頂いた方法でやってみようと思います。

また
■BindingSource1.Current

■新規行を追加する場合や、既存行を編集する場合
のプログラムに配慮が必要なところまで
ご教授頂きありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -