DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewでバインド元のデータ取得

環境/言語:[VS2005 C#]
分類:[.NET]

DataGridViewにDataTableをバインドしてデータを表示しています。
プログラムからDataGridViewのデータを変更するのに
DataTableの値を変更して行っています。

dataGridView1.DataSource = dataTable1;

for(int i=0;i<dataTable1.Rows.Count;i++){
DataRow row = dataTable1.Rows[i];
row["col1"] = "ああああ";
}

通常は、この方法で問題ないのですが、ソートが行われた場合困った事が起きます。
上から順番に処理を行ってエラーになった行で止まり、それ以降の行を処理しない
という仕様なのですが、ソートされた場合に「上から順番に」という事ができなくなって
しまっています。
(DataTable上では上から順番になんですが、DataGridView上ではそうは見えない状態です。)

やりたい事は、DataGridViewからバインドされている実際のDataTableの行を取得したい
と思っています。
http://dobon.net/vb/dotnet/datagrid/currentrow.html
等で紹介されている方法では、常にカレント行からDataTableの値を取得していますが
そうではなく、DataGridViewの任意の行から実際のDataTableの値を取得したいのですが
可能でしょうか? イメージ的には以下のような感じです。

for(int i=0;i<dataTable1.Rows.Count;i++){
BindingManagerBase bm =
DataGrid1.BindingContext[DataGrid1.DataSource, DataGrid1.DataMember];
DataRowView drv = (DataRowView) bm[i]; // 任意の行が欲しい
DataRow dr = drv.Row;
}

開発環境
VS2005 C#
WindowsXP
としさん

bmのPositionを移動させながらCurrentを取得したらいかがでしょう。
BindingManagerBase bm =
dataGridView1.BindingContext[dataGridView1.DataSource, dataGridView1.DataMember];

for (int i = 0; i < bm.Count; i++)
{
bm.Position = i;
DataRowView drv = (DataRowView)bm.Current; // 任意の行が欲しい
DataRow dr = drv.Row;
System.Diagnostics.Debug.WriteLine(i.ToString().PadRight(3) + dr[1]);
}
■No23818に返信(きいよさんの記事)
きいよさん、ありがとうございます!

目的通りの処理を行うことが出来るようになりました。
最悪、DataGridViewから値を取得しようかと思っておりましたので
DataTableから取得できて良かったです、助かりました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板