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

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

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

Re[3]: DataGridViewの行インデックス取得


(過去ログ 60 を表示中)

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

■34574 / inTopicNo.1)  DataGridViewの行インデックス取得
  
□投稿者/ ryouma (1回)-(2009/04/01(Wed) 20:10:44)

分類:[.NET 全般] 

初めて質問させていただきます。

DataGridView/DataTableについての質問なのですが…

DataTableにてあるDataRowを特定しそのDataRowに紐づいているDataGridViewのRowIndexに該当するものを
取得したいと考えております。

検索してみても、DataGridView→DataTableに該当するDataRowの取得方法はよく出てくるのですが、
逆のDataRow→DataGridViewのRowIndex取得方法についてはあまり記載されていません。
(理解できていないだけなのかもですが…)

どなたかご存知の方がいらっしゃりましたらご教授お願いします。
引用返信 編集キー/
■34576 / inTopicNo.2)  Re[1]: DataGridViewの行インデックス取得
□投稿者/ 魔界の仮面弁士 (1033回)-(2009/04/01(Wed) 21:06:33)
No34574 (ryouma さん) に返信
> 検索してみても、DataGridView→DataTableに該当するDataRowの取得方法はよく出てくるのですが、

それは例えば、こういうコードの事でしょうか?

《C#》
DataRow row = ((DataRowView)dataGridView1.Rows[行].DataBoundItem).Row;

《VB (Option Strict Off)》
Dim row As DataRow = DataGridView1.Rows(行).DataBoundItem.Row

《VB (Option Strict On)》
Dim row As DataRow = DirectCast(DataGridView1.Rows(行).DataBoundItem, DataRowView).Row


> 逆のDataRow→DataGridViewのRowIndex取得方法についてはあまり記載されていません。

DataGridView は、自身の DataSource に何が割り当てられているかを知っていますが、
DataTable は、自分がどのクラスの DataSource に割り当てられているのかを把握できません。
(一つの DataTable を、複数の DataGridView に割り当てることもできますし)


ですから、DataGridView → DataRow という探し方はできたとしても、
DataTable → DataGridViewRow という探し方はできません。
引用返信 編集キー/
■34577 / inTopicNo.3)  Re[2]: DataGridViewの行インデックス取得
□投稿者/ ryouma (3回)-(2009/04/01(Wed) 21:27:45)
ありがとうございます。

> それは例えば、こういうコードの事でしょうか?
>
> 《C#》
> DataRow row = ((DataRowView)dataGridView1.Rows[行].DataBoundItem).Row;
>
> 《VB (Option Strict Off)》
> Dim row As DataRow = DataGridView1.Rows(行).DataBoundItem.Row
>
> 《VB (Option Strict On)》
> Dim row As DataRow = DirectCast(DataGridView1.Rows(行).DataBoundItem, DataRowView).Row

そうです。
実際私もこのようにDataRowを取得しています。

>
>>逆のDataRow→DataGridViewのRowIndex取得方法についてはあまり記載されていません。
>
> DataGridView は、自身の DataSource に何が割り当てられているかを知っていますが、
> DataTable は、自分がどのクラスの DataSource に割り当てられているのかを把握できません。
> (一つの DataTable を、複数の DataGridView に割り当てることもできますし)
>
>
> ですから、DataGridView → DataRow という探し方はできたとしても、
> DataTable → DataGridViewRow という探し方はできません。

そうでしたか…
勉強不足でスミマセン…

ただ、DataTable.DefaultView(DataView)に保持している順序はDataGridViewでの表示順と同じだと
認識しているのですが…
そこから辿っていくすべがあるのかと思いまして…
例えば
DataTable.DefaultViewから現在作業中のDataRowに対応するDataRowViewが特定できないかと…
今試行錯誤しているのですが…

 DataTable dtbl = (DataTable)grid.DataSource;
 DataRow drow = dtbl.Rows[xx]; // 作業している行です…
 
 int index = 0;
 foreach(DataRowView drv in dtbl.DefaultView){
  if(drv.Row == drow){
   break;
  }
  index++;
 }

 これで一応表示上の行インデックスは取得できたのですが…
 なんだかスマートじゃないとおもいまして…

実際現在作業しているDataRowに該当するグリッド上のインデックスを取得するには
どのようにするのがよいのかご存知でしたら教えていただけないでしょうか。
よろしくお願いします。
引用返信 編集キー/
■34581 / inTopicNo.4)  Re[3]: DataGridViewの行インデックス取得
□投稿者/ 魔界の仮面弁士 (1034回)-(2009/04/01(Wed) 22:34:00)
2009/04/02(Thu) 11:13:28 編集(投稿者)

No34577 (ryouma さん) に返信
> ただ、DataTable.DefaultView(DataView)に保持している順序はDataGridViewでの表示順と同じだと
> 認識しているのですが…

たとえば、
 dataGridView1.DataSource = new DataView(tbl1);
 dataGridView2.DataSource = tbl1;
 dataGridView3.DataSource = new BindingSource(tbl1, "");
の場合、dataGridView1 の順序は、tbl1.DefaultView.Sort ではありませんよね。

(tbl1 側は、.DefaultView を使っているのか、new DataView を使っているのか把握できません)


なお、DataGridView の行のバインド先の行が、tbl1.DefaultView 上にあるという保証はありません。
何故なら、DataGridView.AllowUserToAddRows = true の場合、最下行に「新規行」があるわけですが、
入力中の新規行が指す DataRow は、まだ DataTable にさえ登録されていない状態ですから。


ただし、「現在のカーソル行」に限定した話であれば、中継役となる BindingManagerBase から
取得できる可能性はありますけれどね。BindingSource や Form.BindingContext[o] の Position プロパティなど。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -