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

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

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

DataGridViewの行を選択→テキストボックスに反映

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

■89240 / inTopicNo.1)  DataGridViewの行を選択→テキストボックスに反映
  
□投稿者/ VB.net初心者 (1回)-(2018/11/13(Tue) 11:43:41)

分類:[VB.NET/VB2005 以降] 

開発環境はVisualStudio2017、使用言語はVB.netです。

DataGridViewの行を選択したときに各列の文字列を各列ごとにテキストボックスに反映させたいです。

1行目を選択したときに1行目A列をテキストボックス1へ、1行目B列をテキストボックス2へ、という感じのプログラムを作りたいです。

御力添えよろしくお願いします。
引用返信 編集キー/
■89241 / inTopicNo.2)  Re[1]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ WebSurfer (1659回)-(2018/11/13(Tue) 11:59:31)
No89240 (VB.net初心者 さん) に返信

DataGridView.CellClick イベントを利用してはいかがですか?

そのハンドラの引数 DataGridViewCellEventArgs オブジェクトから RowIndex プロパティ
でイベントが発生したセルの行インデックスを示す値を取得できます。

インデックスが取得できれば、

> 各列の文字列を各列ごとにテキストボックスに反映させたいです。

は可能だと思います。
引用返信 編集キー/
■89242 / inTopicNo.3)  Re[1]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ 魔界の仮面弁士 (1928回)-(2018/11/13(Tue) 12:00:15)
No89240 (VB.net初心者 さん) に返信
> DataGridViewの行を選択したときに
どのイベントを使うべきかは調査できていますか?
複数行選択された場合はどうしますか?


http://www.vb-user.net/junk/replySamples/2018.11.13.11.51/datagridview.png

たとえば上記の場合、
 CurrentCellAddress は {列 = 0, 行 = 5} ですが、
 SelectedRows が指し示す行番号は { 3, 2, 0 }
となりますので、Datagridview1.CurrentRow.Selected は False となりますが、
この場合はどのセルを対象としたいのでしょうか?


> 各列の文字列を
該当列のセルタイプが DataGridViewTextBoxCell 以外だった場合を考慮する必要がありますか?
データバインドを行っている場合、書式設定は施していますか?


> 各列ごとにテキストボックスに反映させたいです。
DataGridView1(colIndex, rowIndex).Value
DataGridView1(colIndex, rowIndex).FormattedValue
で各セルの値を得られます。

また、RowEnter イベントや CellEnter イベントについては、
引数 e.RowIndex で行番号を得ることができます。
引用返信 編集キー/
■89249 / inTopicNo.4)  Re[2]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ VB.net初心者 (2回)-(2018/11/13(Tue) 15:10:16)
返信ありがとうございます。
初心者のため用語の意味を調べながら返信しております。
間違って解釈している場合もありますことを御留意ください。

No89241(WebSurfer さん)に返信
イベントはCellContentClickを利用しています。


No89242 (魔界の仮面弁士 さん) に返信
> ■No89240 (VB.net初心者 さん) に返信
>>DataGridViewの行を選択したときに
> どのイベントを使うべきかは調査できていますか?
CellContentClickを使用しようしたいと思っています。

> 複数行選択された場合はどうしますか?
複数行選択された場合はメッセージボックスでエラー表示したいと思います。

> http://www.vb-user.net/junk/replySamples/2018.11.13.11.51/datagridview.png
> たとえば上記の場合、、、、
> この場合はどのセルを対象としたいのでしょうか?
最後にクリックされた行の各列のセルを対象にしたいです。
画像では矢印の行?ですかね。

>>各列の文字列を
> 該当列のセルタイプが DataGridViewTextBoxCell 以外だった場合を考慮する必要がありますか?
> データバインドを行っている場合、書式設定は施していますか?
書式設定は施していません。
引用返信 編集キー/
■89251 / inTopicNo.5)  Re[3]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ WebSurfer (1661回)-(2018/11/13(Tue) 15:50:18)
No89249 (VB.net初心者 さん) に返信

> ■No89241(WebSurfer さん)に返信
> イベントはCellContentClickを利用しています。

CellContentClick イベントのハンドラでも引数 DataGridViewCellEventArgs オブジェクトから
RowIndex プロパティでイベントが発生したセルの行インデックスを示す値を取得できます。

複数選択された場合の処置とかを考えるのはとりあえず置いといて、行インデックスから必要な
データを DataGridView から取得する方法は分かりますよね?

であれば、そこまで進めてみてはいかがですか? その後、複数行選択云々を考えてもいいと思う
のですが・・・
引用返信 編集キー/
■89252 / inTopicNo.6)  Re[3]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ 魔界の仮面弁士 (1930回)-(2018/11/13(Tue) 15:56:22)
No89249 (VB.net初心者 さん) に返信
> イベントはCellContentClickを利用しています。

それはお奨めできません。セルの内容をクリックしないと反応しない可能性があるためです。


たとえば下記の場合、セルをクリックしても、CellContentClick イベントは発生しません。

テキスト内に文字列を書き込み、その文字列(セルの内容)をクリックしたときに
始めて CellContentClick が発生します。テキストが書き込まれているセルであっても、
セルの余白部分をクリックした場合は、セルの内容をクリックした事にはならないのでご注意ください。


Public Class Form1
 Private WithEvents dgv As DataGridView
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Controls.Clear()
  dgv = New DataGridView()
  dgv.Dock = DockStyle.Fill
  dgv.ColumnCount = 8
  dgv.RowCount = 30
  Controls.Add(dgv)
 End Sub

 Private Sub dgv_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellContentClick
  Text = e.RowIndex.ToString()
 End Sub
End Class


> 最後にクリックされた行の各列のセルを対象にしたいです。
複数行選択は必要ですか?
不要なら MultiSelect プロパティを False にしておきましょう。

ついでに行全体を選択状態にするため、
SelectionMode プロパティを FullRowSelect にしておくのも良さそうです。


> 画像では矢印の行?ですかね。
その場合は、CurrentCellChanged イベントもしくは RowEnter イベントをお奨めします。
これならセルの内容の有無にも左右されませんし、
キーボードの矢印キーなどによる操作に対しても反応します。
引用返信 編集キー/
■89253 / inTopicNo.7)  Re[3]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ 魔界の仮面弁士 (1931回)-(2018/11/13(Tue) 16:09:51)
No89249 (VB.net初心者 さん) に返信
>> データバインドを行っている場合、書式設定は施していますか?
> 書式設定は施していません。

もう一度確認ですが、データバインドは行っていますか?
DataGridView の DataSource プロパティを設定しているか、ということです。


もしバインドしているなら、TextBox にもバインドするのが手っ取り早いです。

たとえばデザイン時に、DataGridView1.DataSource に対して
型付 DataSet 内の DataTable を指定しているような場合、
フォーム上に自動的に BindingSource が生成され、
 DataGridView1.DataSource = DataTable1BindingSource1
相当の状態になります。


この場合、デザイン時に TextBox1 のプロパティで (DataBindings) という項目の
左側にある +/- のアイコンを展開し、その中の Text 欄を開いて、
その DataTable1BindingSource1 が示しているフィールド名を選択します。

あとは Form の Load 時などに
 DataGridView1.DataSource = データテーブル
の部分を
 DataTable1BindingSource.DataSource = データテーブル
に差し替えるだけです。

この場合、DataGridView のイベント処理などを記述せずとも、
現在のカーソル行の内容が、自動的に TextBox にも反映されます。

引用返信 編集キー/
■89254 / inTopicNo.8)  Re[2]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ PANG2 (240回)-(2018/11/13(Tue) 17:02:21)
データが「データソース・ウィンドウ」に表示されるようなものであれば、

ドラッグ&ドロップ一発でDB連携アプリを完全構築!
http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_12/vb2005_12_01.html

Visual Studio データへの Windows フォーム コントロールのバインド
https://msdn.microsoft.com/ja-jp/library/2b4be09b.aspx
引用返信 編集キー/
■89255 / inTopicNo.9)  Re[3]: DataGridViewの行を選択→テキストボックスに反映
□投稿者/ VB.net初心者 (3回)-(2018/11/13(Tue) 17:16:04)
沢山の回答ありがとうございます。

今回はDataBindingでやりたかったことが実現できました。

CellContentClickのデメリット?などイベントの件は今後の参考にしたいと思います。
ありがとうございました!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ