- - PR -
DataGridViewのカレント行の値取得
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-06 14:39
C#にてwindowsアプリケーションを作成しています。
そこでわからないことがあるので、どなたかご指導よろしくお願いします。 現在はDBからデータを読み出し、DataGridVeiwにて表示しています。 そこで、DataGridVeiwの行を選択し、行の値をそれぞれ取得したいのですが 方法が分かりません。 DataGridViewのセルを選択した際は、DataGrid1.CurrentCell.Value で値が取得できているのですが、行を選択した際に行の値をそれぞれ取得する方法は ないのでしょうか? | ||||||||||||||||||||
|
投稿日時: 2006-07-06 17:04
SelectedRows プロパティから、DataGridViewRow のインスタンスが取得できます。 あとは、DataGridViewRow のメンバを見ればわかるかと思いますが、どうでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-11-09 19:06
はじめまして。私も未記入さんと同様な問題に直面しており、ご教授いただきたく 投稿いたします。 DataGridViewのSelectionModeプロパティをFullRowSelectに設定し 先頭のセルを選択すると、その行全体にフォーカスが当たるようにしています。 その後の処理で、各セルの値を抜き出して、テキストボックスに表示させようと しております。 じゃんぬねっとさんのご指南通り、DataGridViewのSelectedRowsプロパティから DataGridViewRowのインスタンスを作ろうとしましたが、名前空間と型の違いから うまくいきませんでした。 何かいい方法はないものでしょうか。何分初心者に近いもので・・・ どうかご教授の方、よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 2007-11-09 19:13
名前空間? どのようなコードで試したのでしょうか?
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-11-12 09:29
コードは以下のようになります。 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'に暗黙的に変換できません。 というものです。型が合わず、暗黙の変換もできないというものです。名前空間とはちょっとかけ離れたお話でしたね。すみません。どうでしょうか。これらの情報から何か問題となっていることはわかりますでしょうか?必要であればまた情報を出すようにいたします。よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 2007-11-12 10:52
DataGridView使ってるから、.NET Framework 2.0以降って事だよね。 もしそうなら、BindingSource使った方が楽できる気がする。 Bindingの設定だけしておけば、後はFrameworkがよきに計らってくれるから。 ちなみにエラーについては、
MSDNでDataGridView.SelectedRowsの説明を確認すれば分かりますが、このプロパティは選択された複数行を保持するDataGridViewSelectedRowCollectionを返します(だから〜Rowsと名づけられている) よって、DataGridViewRowには代入できず、
って言われるのです。
とすれば、エラーにはなりません。 それ以前に、最初に書いたように、BindingSourceの使用をお勧めします。 | ||||||||||||||||||||
|
投稿日時: 2007-11-12 14:10
かずくんさん、ご回答、誠にありがとうございます。
BindingSource、さっそく調べてみました。が、要領を得ませんでした(; どんな時に、どのようにして使うものなのかがさっぱりわからないのです。 C#(.NET)も使い出してからまだ日も浅く、かずくんさんのおっしゃっている 意味がよくわからずにいます。(初心者丸出しですね・・・汗) ここでもう一度、情報を整理します。 DataSetを生成し、OleDbDataAdapterでMS-Access(.mdb)からDataSetに データを取得してます。 その後、DataGridViewのDataSourceにDataSetからデータを取得しています。 で、ここからが本題なのですが、先にも書きました通り、DataGridViewの SelectionModeプロパティにFullRowSelectをセットし、DataGridViewのセルを 選択すると、その行全体が選択される、つまりフォーカスが当たるように設定を しているのです。 と、ここまでが前提条件です。問題はこの後で どこでもいいのですが、ある行を選択したとして、そこには機種、型式、機番といった 情報が入っているとします。 その情報を、3つのテキストボックスにバラバラに表示したいだけなのです。 たったそれだけのことなのですが
このかずくんさんのご指摘は、まったく意味がわかりませんでした。 使い方も全くわかりませんです。MSDNなども見てみましたが、意味不明とさえ 思えました。 DataGridView.SelectedRowsの説明についてはわかりました。 選択された複数行を保持するDataGridViewSelectedRowCollectionを返すという意味もわかりました。
確かにエラーにはなりませんが、本当の先頭しか取れません。 インデックスを1にすると、"インデックスが範囲を超えています。負でない値で、 コレクションのサイズよりも小さくなければなりません。\r\nパラメータ名: index" となってしまいます。SelectionModeプロパティにFullRowSelectをセットしたことにより セルとしては1つとしか見ないからだと推測しています。 BindingSource、使ってみたいのですが、使い方もよくわかりません。 使用方法、もしくは使用方法をわかりやすく説明しているサイトなどございましたら ご教授いただけると幸いです。よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 2007-11-12 14:49
マスタメンテに適用されるような、一覧−明細形式の画面何ですよね。 そして、一覧側で選択した行の詳細を明細側に表示する構成なのですよね。 もしそうなら、まずは.NET Framework 2.0のWindowsフォーム新機能(後編)(atmarkit.co.jp)を読まれることをお勧めします。
詳細は、上記サイトを見ていただくとして、 DataGridViewのDataSourceとしてDataSetを指定するのではなく DataGridView -- BindingSource -- DataSetと間に一枚はさむ構成をとらせます。 他の明細も同様に、一枚はさむ構成をとらせます。 たったこれだけのことで
が、できてしまうという寸法。 まずは、上記のサイトを読んで見てください。 ただこれだけでは、なぜ実現できるかという部分が抜けてしまうので、 できればその後、MSDNにて、なぜの部分を勉強してみてください。 |