- PR -

DataGridViewのカレント行の値取得

投稿者投稿内容
未記入
会議室デビュー日: 2006/07/06
投稿数: 1
投稿日時: 2006-07-06 14:39
C#にてwindowsアプリケーションを作成しています。

そこでわからないことがあるので、どなたかご指導よろしくお願いします。

現在はDBからデータを読み出し、DataGridVeiwにて表示しています。

そこで、DataGridVeiwの行を選択し、行の値をそれぞれ取得したいのですが
方法が分かりません。
DataGridViewのセルを選択した際は、DataGrid1.CurrentCell.Value
で値が取得できているのですが、行を選択した際に行の値をそれぞれ取得する方法は
ないのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-06 17:04
引用:

未記入さんの書き込み (2006-07-06 14:39) より:

そこで、DataGridVeiwの行を選択し、行の値をそれぞれ取得したいのですが方法が分かりません。
DataGridViewのセルを選択した際は、DataGrid1.CurrentCell.Value で値が取得できているのですが、行を選択した際に行の値をそれぞれ取得する方法はないのでしょうか?


SelectedRows プロパティから、DataGridViewRow のインスタンスが取得できます。
あとは、DataGridViewRow のメンバを見ればわかるかと思いますが、どうでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
K-Kei
会議室デビュー日: 2004/09/01
投稿数: 7
投稿日時: 2007-11-09 19:06
引用:

じゃんぬねっとさんの書き込み (2006-07-06 17:04) より:
引用:

未記入さんの書き込み (2006-07-06 14:39) より:

そこで、DataGridVeiwの行を選択し、行の値をそれぞれ取得したいのですが方法が分かりません。
DataGridViewのセルを選択した際は、DataGrid1.CurrentCell.Value で値が取得できているのですが、行を選択した際に行の値をそれぞれ取得する方法はないのでしょうか?


SelectedRows プロパティから、DataGridViewRow のインスタンスが取得できます。
あとは、DataGridViewRow のメンバを見ればわかるかと思いますが、どうでしょうか?





はじめまして。私も未記入さんと同様な問題に直面しており、ご教授いただきたく
投稿いたします。
DataGridViewのSelectionModeプロパティをFullRowSelectに設定し
先頭のセルを選択すると、その行全体にフォーカスが当たるようにしています。
その後の処理で、各セルの値を抜き出して、テキストボックスに表示させようと
しております。
じゃんぬねっとさんのご指南通り、DataGridViewのSelectedRowsプロパティから
DataGridViewRowのインスタンスを作ろうとしましたが、名前空間と型の違いから
うまくいきませんでした。
何かいい方法はないものでしょうか。何分初心者に近いもので・・・
どうかご教授の方、よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-09 19:13
名前空間? どのようなコードで試したのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
K-Kei
会議室デビュー日: 2004/09/01
投稿数: 7
投稿日時: 2007-11-12 09:29
引用:

じゃんぬねっとさんの書き込み (2007-11-09 19:13) より:
名前空間? どのようなコードで試したのでしょうか?





コードは以下のようになります。
private void dGridView_CellContentClick(object sender, ataGridViewCellEventArgs e) {
try {
//--------------------------------------------------------------
// 現在のカレントセルの内容をテキストボックスに表示する
//--------------------------------------------------------------
DataGridViewRow dgViewRow = dGridView.SelectedRows; ←ここでDataGridViewRowのインスタンスを作っています。作り方が間違ってますか・・・?
txtKisyu.Text = (string)dGridView.CurrentCell.Value;
// MessageBox.Show(dGridView.CurrentCell.ColumnIndex.ToString());
txtKeishiki.Text = (string)dGridView.CurrentCell.Value;
// MessageBox.Show(dGridView.CurrentCell.ColumnIndex.ToString());
txtKiban.Text = (string)dGridView.CurrentCell.Value;
// MessageBox.Show(dGridView.CurrentCell.ColumnIndex.ToString());
}
catch (Exception ecell) {
MessageBox.Show(ecell.Message);
}
}
上のメソッドは、DataGridViewをクリックした時に実行されるイベントハンドラです。やりたいことは、各テキストボックスである、txtKisyuに機種を、txtKeishikiに型式を、txtKibanに機番を表示させるという処理です。DataGridViewのSelectionModeプロパティをFullRowSelectに設定したとしても、各セルの値は抜き出せると思うんですよね。そのやり方がわからないのです。
ちなみに出てくるコンパイルエラーは、型'System.Windows.Forms.DataGridViewSelectedRowCollection'を型'System.Windows.Forms.DataGridViewRow'に暗黙的に変換できません。
というものです。型が合わず、暗黙の変換もできないというものです。名前空間とはちょっとかけ離れたお話でしたね。すみません。どうでしょうか。これらの情報から何か問題となっていることはわかりますでしょうか?必要であればまた情報を出すようにいたします。よろしくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-12 10:52
引用:

K-Keiさんの書き込み (2007-11-12 09:29) より:

コードは以下のようになります。
(snip)
上のメソッドは、DataGridViewをクリックした時に実行されるイベントハンドラです。やりたいことは、各テキストボックスである、txtKisyuに機種を、txtKeishikiに型式を、txtKibanに機番を表示させるという処理です。


DataGridView使ってるから、.NET Framework 2.0以降って事だよね。
もしそうなら、BindingSource使った方が楽できる気がする。
Bindingの設定だけしておけば、後はFrameworkがよきに計らってくれるから。

ちなみにエラーについては、
引用:

コード:
 DataGridViewRow dgViewRow = dGridView.SelectedRows; ←ここでDataGridViewRowのイン




MSDNでDataGridView.SelectedRowsの説明を確認すれば分かりますが、このプロパティは選択された複数行を保持するDataGridViewSelectedRowCollectionを返します(だから〜Rowsと名づけられている)
よって、DataGridViewRowには代入できず、
引用:

ちなみに出てくるコンパイルエラーは、型'System.Windows.Forms.DataGridViewSelectedRowCollection'を型'System.Windows.Forms.DataGridViewRow'に暗黙的に変換できません。
というものです。


って言われるのです。

コード:
DataGridViewRow dgViewRow = dGridView.SelectedRows[0]


とすれば、エラーにはなりません。

それ以前に、最初に書いたように、BindingSourceの使用をお勧めします。
K-Kei
会議室デビュー日: 2004/09/01
投稿数: 7
投稿日時: 2007-11-12 14:10
かずくんさん、ご回答、誠にありがとうございます。
BindingSource、さっそく調べてみました。が、要領を得ませんでした(;
どんな時に、どのようにして使うものなのかがさっぱりわからないのです。
C#(.NET)も使い出してからまだ日も浅く、かずくんさんのおっしゃっている
意味がよくわからずにいます。(初心者丸出しですね・・・汗)

ここでもう一度、情報を整理します。
DataSetを生成し、OleDbDataAdapterでMS-Access(.mdb)からDataSetに
データを取得してます。
その後、DataGridViewのDataSourceにDataSetからデータを取得しています。
で、ここからが本題なのですが、先にも書きました通り、DataGridViewの
SelectionModeプロパティにFullRowSelectをセットし、DataGridViewのセルを
選択すると、その行全体が選択される、つまりフォーカスが当たるように設定を
しているのです。

と、ここまでが前提条件です。問題はこの後で
どこでもいいのですが、ある行を選択したとして、そこには機種、型式、機番といった
情報が入っているとします。
その情報を、3つのテキストボックスにバラバラに表示したいだけなのです。
たったそれだけのことなのですが

引用:

かずくんさんの書き込み (2007-11-12 10:52) より:

DataGridView使ってるから、.NET Framework 2.0以降って事だよね。
もしそうなら、BindingSource使った方が楽できる気がする。
Bindingの設定だけしておけば、後はFrameworkがよきに計らってくれるから。



このかずくんさんのご指摘は、まったく意味がわかりませんでした。
使い方も全くわかりませんです。MSDNなども見てみましたが、意味不明とさえ
思えました。

DataGridView.SelectedRowsの説明についてはわかりました。
選択された複数行を保持するDataGridViewSelectedRowCollectionを返すという意味もわかりました。

引用:

コード:
DataGridViewRow dgViewRow = dGridView.SelectedRows[0]


とすれば、エラーにはなりません。

それ以前に、最初に書いたように、BindingSourceの使用をお勧めします。



確かにエラーにはなりませんが、本当の先頭しか取れません。
インデックスを1にすると、"インデックスが範囲を超えています。負でない値で、
コレクションのサイズよりも小さくなければなりません。\r\nパラメータ名: index"
となってしまいます。SelectionModeプロパティにFullRowSelectをセットしたことにより
セルとしては1つとしか見ないからだと推測しています。
BindingSource、使ってみたいのですが、使い方もよくわかりません。
使用方法、もしくは使用方法をわかりやすく説明しているサイトなどございましたら
ご教授いただけると幸いです。よろしくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-12 14:49
引用:

K-Keiさんの書き込み (2007-11-12 14:10) より:
BindingSource、さっそく調べてみました。が、要領を得ませんでした(;
どんな時に、どのようにして使うものなのかがさっぱりわからないのです。
C#(.NET)も使い出してからまだ日も浅く、かずくんさんのおっしゃっている
意味がよくわからずにいます。(初心者丸出しですね・・・汗)


マスタメンテに適用されるような、一覧−明細形式の画面何ですよね。
そして、一覧側で選択した行の詳細を明細側に表示する構成なのですよね。
もしそうなら、まずは.NET Framework 2.0のWindowsフォーム新機能(後編)(atmarkit.co.jp)を読まれることをお勧めします。

引用:

ここでもう一度、情報を整理します。
DataSetを生成し、OleDbDataAdapterでMS-Access(.mdb)からDataSetに
データを取得してます。
その後、DataGridViewのDataSourceにDataSetからデータを取得しています。


詳細は、上記サイトを見ていただくとして、
DataGridViewのDataSourceとしてDataSetを指定するのではなく
DataGridView -- BindingSource -- DataSetと間に一枚はさむ構成をとらせます。
他の明細も同様に、一枚はさむ構成をとらせます。

たったこれだけのことで
引用:

で、ここからが本題なのですが、先にも書きました通り、DataGridViewの
SelectionModeプロパティにFullRowSelectをセットし、DataGridViewのセルを
選択すると、その行全体が選択される、つまりフォーカスが当たるように設定を
しているのです。

と、ここまでが前提条件です。問題はこの後で
どこでもいいのですが、ある行を選択したとして、そこには機種、型式、機番といった
情報が入っているとします。
その情報を、3つのテキストボックスにバラバラに表示したいだけなのです。
たったそれだけのことなのですが


が、できてしまうという寸法。

まずは、上記のサイトを読んで見てください。
ただこれだけでは、なぜ実現できるかという部分が抜けてしまうので、
できればその後、MSDNにて、なぜの部分を勉強してみてください。

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