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

わんくま同盟

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

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

ツリー一括表示

DataGridで表を動かさずに読みたい /ゆ牛 (17/11/10(Fri) 17:05) #85624
Re[1]: DataGridで表を動かさずに読みたい /WebSurfer (17/11/10(Fri) 18:02) #85625
│└ Re[2]: DataGridで表を動かさずに読みたい /ゆ牛 (17/11/10(Fri) 20:05) #85626
│  └ Re[3]: DataGridで表を動かさずに読みたい /furu (17/11/10(Fri) 21:24) #85627
Re[1]: DataGridで表を動かさずに読みたい /魔界の仮面弁士 (17/11/10(Fri) 21:52) #85629
      └ Re[4]: DataGridで表を動かさずに読みたい /furu (17/11/10(Fri) 21:28) #85628
        └ Re[5]: DataGridで表を動かさずに読みたい /ゆ牛 (17/11/13(Mon) 15:33) #85660 解決済み


親記事 / ▼[ 85625 ] ▼[ 85629 ]
■85624 / 親階層)  DataGridで表を動かさずに読みたい
□投稿者/ ゆ牛 (1回)-(2017/11/10(Fri) 17:05:25)

分類:[.NET 全般] 

DataGridを使っています(DataGridViewではありません)。

表の中身を先頭から最大まで読み取りたくて下記処理を書きましたが
このやり方だと、処理中に表が動作(カーソル移動やスクロール)します。
表を動作させずに表の中身を読み取る方法がありますでしょうか。
よろしくお願いします。す

BindingManagerBase BMB = dataGrid1.BindingContext[dataGrid1.DataSource, dataGrid1.DataMember];
int n = BMB.Count;
for (int i = 0; i < n; i++)
{
  BMB.Position = i; // ここでカーソルが動く
  DataRow row = ((DataRowView)BMB.Current).Row;
  int nakami = (int)row["nakami"];
  // nakamiの処理
}


[ □ Tree ] 返信 編集キー/

▲[ 85624 ] / ▼[ 85626 ]
■85625 / 1階層)  Re[1]: DataGridで表を動かさずに読みたい
□投稿者/ WebSurfer (1336回)-(2017/11/10(Fri) 18:02:24)
No85624 (ゆ牛 さん) に返信

何を作っているのですか? Microsoft の .NET のライブラリに限っても DataGrid は
Windows Forms, ASP.NET Web Forms にあります。(コードを読めばわかるとは言わない
でくださいね。質問者さんが一行書けば済むことなのですから)

あと、自便の開発環境(OS, .NET, Visual Studio のバージョンなど)も書いてくださ
い。それによって答えが違ってくることもあります。
[ 親 85624 / □ Tree ] 返信 編集キー/

▲[ 85625 ] / ▼[ 85627 ]
■85626 / 2階層)  Re[2]: DataGridで表を動かさずに読みたい
□投稿者/ ゆ牛 (2回)-(2017/11/10(Fri) 20:05:15)
作っているのはWindowsフォームアプリケーションです。

開発環境は、下記です。
 Windows 10 32bit
 .NET Framework 4
 Visual Studio 2015

蛇足かもしれませんが…
dataGrid1.DataSourceには、DataSetのTablesがつながっています。
そのTablesのColumnsに読み取りたい「中身」があります。
dataGrid1.DataMemberには、何もつながっていません(プロパティが空欄)。

ご面倒かけて恐縮です。

[ 親 85624 / □ Tree ] 返信 編集キー/

▲[ 85626 ] / ▼[ 85628 ]
■85627 / 3階層)  Re[3]: DataGridで表を動かさずに読みたい
□投稿者/ furu (131回)-(2017/11/10(Fri) 21:24:28)
No85626 (ゆ牛 さん) に返信

BindingManagerBase使わなくてもいいんじゃない。

var rows = ((DataTable)dataGrid1.DataSource).Rows;
for (int i = 0; i < rows.Count; i++)
{
    var row = rows[i];
    int nakami = (int)row["nakami"];
  // nakamiの処理
}

[ 親 85624 / □ Tree ] 返信 編集キー/

▲[ 85624 ] / 返信無し
■85629 / 1階層)  Re[1]: DataGridで表を動かさずに読みたい
□投稿者/ 魔界の仮面弁士 (1458回)-(2017/11/10(Fri) 21:52:13)
No85624 (ゆ牛 さん) に返信
> 表を動作させずに表の中身を読み取る方法がありますでしょうか。

こうとか。Filter や Sort 条件も指定できます。

DataView view = new DataView((DataTable)dataGrid1.DataSource);
foreach (DataRowView rowView in view)
{
 DataRow row = rowView.Row;
 int nakami = row.Field<int>("nakami");
 // nakamiの処理
}



元の実装(BindingContext)に近いコードにするなら、こうかな。
ソート(DataGrid の列ヘッダーをクリック)して居た場合には、こちらの方が良いかもしれません。

using (var bnd = new BindingSource(dataGrid1.DataSource, dataGrid1.DataMember))
{
 int n = bnd.Count;
 for (int i = 0; i < n; i++)
 {
  DataRow row = ((DataRowView)bnd[i]).Row;
  int nakami = (int)row["nakami"];
  // nakamiの処理
 }
}
[ 親 85624 / □ Tree ] 返信 編集キー/

▲[ 85627 ] / ▼[ 85660 ]
■85628 / 4階層)  Re[4]: DataGridで表を動かさずに読みたい
□投稿者/ furu (132回)-(2017/11/10(Fri) 21:28:27)
No85626 (ゆ牛 さん) に返信

もひとつ
※これだと挿入用の空行も取ってきちゃう

for (int i = 0; i < dataGrid1.RowCount; i++)
{
    var row = dataGrid1.Rows[i];
    int nakami = (int)row.Cells["nakami"].Value;
  // nakamiの処理
}

[ 親 85624 / □ Tree ] 返信 編集キー/

▲[ 85628 ] / 返信無し
■85660 / 5階層)  Re[5]: DataGridで表を動かさずに読みたい
□投稿者/ ゆ牛 (3回)-(2017/11/13(Mon) 15:33:10)
問題解決しました。
 ・furuさんの一つ目
 ・魔界の仮面弁士さんの二つ目
で期待どおり、表を動作させずに、表の中身を読み取れました。

残り二つについては、なぜかコンパイルエラー、
 ・error CS1061: 'DataGrid' に 'Rows' の定義が含まれておらず…
 ・error CS1061: 'DataGrid' に 'Rows' の定義が含まれておらず…
 ・error CS1061: 'DataRow' に 'Field' の定義が含まれておらず…
チャンスがあれば原因しらべて報告します。

ちなみに、余談かもしれませんが、
 ・「空行」については今回表示されてません(ReadOnly==Trueによる?)
 ・「ソート」については、効かないようにしています(AllowSorting==False)

どうもありがとうございました。
感謝します。


解決済み
[ 親 85624 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -