- PR -

DataGridでソート後の選択行を取得したい

1
投稿者投稿内容
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-11-18 12:29
IDとNameという2つカラムを持ったDataTableをひとつ持ったDataSetをDataGrid(名前はdgDataSet)のDataSourceに設定しています。

ID Name
1 名前1
2 名前2
3 名前3

これをIDでソートして (DataGridのID列をクリックしてソート)

ID Name
3 名前3
2 名前2
1 名前1

と並び替えてから、最初の行(DataGridのID=3の行)をクリックすると
ID=1、Name=名前1
の行が選択されてしまいます・・

選択行を取得するコードは以下を使用しています。
DataGrid.HitTestInfo info = ((DataGrid)sender).HitTest(e.X, e.Y);
int selectedIndex = info.Row;

一応
DataView view = ((DataSet)this.dgSample.DataSource).Tables[0].DefaultView;
int result = (int)view[selectedIndex]["ID"];

と記述して確認したのですが、やはり並び替え前の値(ID=1)が取得されてしまいます・・

ソート後に行を選択して、正しい値を取得するにはどうしたら良いのでしょうか?

VisualStudio2003 Pro + Win2000 ServerでWindowsフォームで開発しています。

宜しくお願いいたします。


にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-11-18 12:52
引用:

DataView view = ((DataSet)this.dgSample.DataSource).Tables[0].DefaultView;
int result = (int)view[selectedIndex]["ID"];


としてしまうと、並べ替える前のビューに対して操作していますよね。
コード:
view = (DataView)this.dgSample.DataSource;


じゃだめですか?
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-11-18 12:57
にしざきさん、レスありがとうございます。

DataGridのDataSourceにDataSetを設定して、DataMemberでDataTable名を指定している為、

view = (DataView)this.dgSample.DataSource;

ではキャストエラーが出てしまいます・・

ここでふと思ったのですが、DataSourceにDataViewを渡さないと、ソート後の選択行は取得できないのでしょうか?
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-11-18 13:14
あ、本当だ。なら、
コード:
CurrencyManager manager = (CurrencyManager)this.BindingContext[this.dgSample.DataSource];
DataRowView view = (DataRowView)manager.List[index];


でどうでしょうか。
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-11-18 14:56
BindingContextを使う方法でもやはりダメでした・・

DataSourceにDataSetではなく、DataViewを渡してやってみます。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-11-18 15:10
Osです。

確認ですが、ソート後の現在選択されているセルまたは行のDataRowが取得できればいいのであれば、以下の方法でカレントレコードが取得できるかと思います。

CurrencyManager cm = (CurrencyManager)this.BindingContext this.dgSample.DataSource];

DataRow dr = ((DataRowView).Current).Row;
あひる隊長
常連さん
会議室デビュー日: 2003/07/23
投稿数: 36
投稿日時: 2004-11-18 16:24
結局
DataRow row = ((DataRowView)dgSample.BindingContext[dgSample.DataSource, dgSample.DataMember].Current).Row;

というコードを当初のMouseDownイベントではなくて、CurrentCellChangedイベントに記述することで希望通りの処理を行うことができました。

みなさん、本当にありがとうございました。
1

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