• 締切済み

DataGridView 複数選択で行番号の取得

Visual Basic 2008 を使っています。 DataGridViewで複数の行を選択したとき、それぞれが何行目なのかを取得するにはどうしたらいいでしょうか? 具体的には、複数選択されている行の0列目の値をテキストボックスに表示するという動作を行いたいです。 自分で書いたコードをペーストしておきます。 Dim count As Integer = Me.DataGridView1.SelectedRows.Count For count = 0 To count - 1 Dim test As String test = Me.DataGridView1.Rows(?何行目か).Cells(0).Value Me.TextBox4.Text = test & "が選択されています。" & vbCrLf & zenkai Dim zenkai As String = Me.TextBox1.Text Next

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

最初の質問文で > 具体的には、複数選択されている行の0列目の値をテキスト > ボックスに表示するという動作を行いたいです。 と書いてあるのが0行目だと伝わったんでしょう。 ・・・私も最初そう読みましたから。 選択行の取得からインデックス0で取り出しても見た目の0行目 とは食い違うので、ソートして0行目だけ取り出すサンプルコード ですね。選択行は全て取得できているので、そのまま全部取り出す コードに変えてください。 中学生レベルの英語能力で、何を命令しているかの概要を掴む事は 数日の勉強で可能なはずです。安易に結論を出し、回答者の責任に する前に、自分でよく検証してください。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

> 上のコードをボタン1のクリックにイベントにコピペしてみたの > ですが、ボタン1を押すと実行画面が勝手に終了してしまいました・・・。 そんな動作の原因になるコードじゃないですね。 実行画面が勝手に終了するのは別の問題ではないでしょうか。 > プログラミングを習って三ヶ月ほどなのでコードなど全然読めない > のですが、私がやりたいこととは少し違うかなと思いました。 中学生レベルの英語能力で、何を命令しているかの概要を掴む事は 数日の勉強で可能なはずです。安易に結論を出し、回答者の責任に する前に、自分でよく検証してください。

ccn87dcn
質問者

補足

実行画面が終了してしまうのは他の部分に問題があったからでした、申し訳ありませんでした。 実行してみたところ、三つの行を選択しましたが、選択した行の一番上の行の左端の値のみ取得できました。 選択した行分のそれぞれの左端の値がほしいと思っています。(三つの行を選択したら三つの値が得られ、五つ選択したら五つの値が得られる)

回答No.1

SelectedRows(0) が選択されている行の中での先頭行かと思ったらそういうわけじゃないんですね。 とりあえず、SortedList を使って行番号でソートしてから0番目を取得するようにしてみました。 Dim sl As New System.Collections.Generic.SortedList(Of Integer, DataGridViewRow) Dim r As DataGridViewRow For Each r In Me.DataGridView1.SelectedRows sl.Add(r.Index, r) Next r = sl.Values(0) Dim test As String = r.Cells(0).Value & "(" & r.Index.ToString() & "行目)" MessageBox.Show(test)

ccn87dcn
質問者

補足

早速の回答ありがとうございます 上のコードをボタン1のクリックにイベントにコピペしてみたのですが、ボタン1を押すと実行画面が勝手に終了してしまいました・・・。 プログラミングを習って三ヶ月ほどなのでコードなど全然読めないのですが、私がやりたいこととは少し違うかなと思いました。    1列  2列  3列 4列   ―――――――――――――― 1行| aa  jj  kk kk 2行| BB  jj  kk kk  ←選択 3行| cc  gg  ll oo  ←選択 4行| EE  ii  pp yy  ←選択 5行| ff  tt  rr ww 6行| qq  uu  uu uu このように、ドラッグで2行と3行と4行が選択されているとき(Ctrlでの複数選択のときも) テキストボックスに BBが選択されています ccが選択されています EEが選択されています と表示したいのですが、可能でしょうか?

関連するQ&A

  • DataGridViewの行取得

    VB2010です。 DataGridViewのDataSourceにコレクションを設定しており、 このコレクションのアイテムを指定してDataGridViewに表示されている行インデックスを取得したい。 以下、現状のコードです。Form1にDataGridView、ボタン、テキストボックスを貼り付けており、 テキストボックスに名前を入力してボタンをおすとその行を選択状態とします。 行を取得するために行頭から順に調べておりますが、 アイテムを指定して行を参照できるようなプロパティなり なにか良い方法が無いでしょうか? Public Class Form1 Private _persons As Collection Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load _persons = New Collection _persons.Add(New Person With {.Name = "あかい", .Age = 10}, "あかい") _persons.Add(New Person With {.Name = "いまい", .Age = 13}, "いまい") _persons.Add(New Person With {.Name = "うかい", .Age = 43}, "うかい") _persons.Add(New Person With {.Name = "えのき", .Age = 8}, "えのき") _persons.Add(New Person With {.Name = "おかの", .Age = 3}, "おかの") DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect DataGridView1.DataSource = _persons Dim col As New DataGridViewColumn col = New DataGridViewTextBoxColumn col.DataPropertyName = "Name" col.Name = "NameField" DataGridView1.Columns.Add(col) col = New DataGridViewTextBoxColumn col.DataPropertyName = "Age" col.Name = "AgeField" DataGridView1.Columns.Add(col) End Sub Private Class Person Public Property Name As String Public Property Age As Integer End Class Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim name As String = TextBox1.Text If name.Length = 0 Then Return If Not _persons.Contains(name) Then Return Dim person As Person = _persons.Item(name) For i As Integer = 0 To DataGridView1.Rows.Count - 1 Dim rowItem As Person = DataGridView1.Rows(i).DataBoundItem If rowItem.Equals(person) Then DataGridView1.Rows(i).Selected = True End If Next End Sub End Class

  • VBの Datagridview 行削除コード

    VB2010でコーディングしています。(VB初心者です。) ネットでDatagridview 行削除コードを調べてボタンに実装したんですが、一回目は削除できるんですが 二回目が削除できません。(削除後にデータを再構築できていない?) ご教授お願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DT As New DataTable DT = DirectCast(Me.DGV.DataSource, DataTable) Dim 削除 As Boolean = False '選択行の取得 For Each r As DataGridViewRow In Me.DGV.SelectedRows      Dim ID As String = DT.Rows(r.Index).Item("ID").ToString      (その他の処理) 'リスト上削除 Me.DGV.Rows.RemoveAt(r.Index) Next r End Sub

  • DataGridViewで、選択した行の値を取得したい。

    VB2005環境です。 VB2005で、選択した行の、特定の列から値を取って、 テキストボックスに出力したいと思っています。 Itemプロパティかと思い、 TxtBox1.Text = Me.DataGridView1.Item _(0,Me.DataGridView1.CurrentRow.Index).ToString と記述してみました。1列目の、選択した行と交わるセルの 値が取れるかと思いきや、うまく取得できません。 方法を教えていただけないでしょうか? よろしくお願いします。

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • DataGridViewでの選択行の取得

    VB2008ExpressEditionを使用しています DataGridViewで行選択モードにし、現在どこの行が選択されているか 取りたいのですが、どのプロパティでしょうか? SelectedIndexというプロパティは出てきません。 For i As Integer = 0 To dgvList.RowCount - 1 If dgvList.SelectedRows(i).Selected = True Then End If Next という回りくどい方法でも RowCountが3あったとしても dgvList.SelectedRows(i).Selectedで 1行目(dgvList.SelectedRows(0).Selected)は参照できますが 2行目(dgvList.SelectedRows(1).Selected)で、落ちます。 分かる方いないでしょうか。

  • DataGridViewでitemを指定してデータ

    DataGridViewでitemを指定してデータを取得する事はできますか? 下記のように座標を指定して取得する方法はわかります。 Dim IntItem1 As Integer = DataGridView1(j, i).Value DataSetの場合は、DataRowに落として取れます。 Dim DataRow1 As DataRow = DataSet1.Tables("Table1").Rows(0) Dim IntItem1 As Integer = DataRow1("Item1") 同じノリで DataGridViewからアイテムを指定してデータを取得したいのですが下記のような事はできませんでした。 Dim DataGridViewRow1 As DataGridViewRow = DataGridView1.Rows(0) Dim IntItem1 As Integer = DataGridViewRow1("Item1") ← エラー 書き方があれば教えて下さい。

  • DataGridViewの値を別フォームに

    こんにちは。 1つ教えて頂けないでしょうか。 Form1にDataGridViewがあり、どれか1行ダブルクリックすると Form2にForm1のDataGridViewの7列目の値の条件で抽出した結果を Form2のDataGridViewに表示したいのです。 Form1からの受け渡しデータはForm2のテキストボックス(条件)に表示させ 受け渡されて来たときは表示ボタンをクリックしなくてもForm2の DataGridViewは表示したいのです。 それぞれのFormは作成し、Form1は Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellDoubleClick Dim f As New Form2 f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Value f.ShowDialog() End Sub とコーディングしました。 Form2は表示されるのですが、データの受け渡しができていないし f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Valueの部分でキャストできませんのエラーに なります。 DataGridViewの選択した値を別のフォームに渡し、そのまま別フォームのDataGridViewを表示させたいのですが。 わかる方おられましたら、教えて頂けないでしょうか。 大変申し訳ありませんが、どうぞよろしくお願いします。

  • DataGridViewで1行全てを選択状態にするには

    VB.NETのDataGridViewについての質問です。 DataGridViewでセルを選択した時に、そのセルの行を全て選択したいのですが、その方法がわからず困っています。 単純な方法を試してみたのですが Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellClick DataGridView.CurrentCell = DataGridView.Rows(e.RowIndex).Cells(-1) End Sub この方法ですと、Cells(-1)の所で境界外となって上手くいかないようです。 何か良い方法がありましたら、ご教授願います

  • エクセル VBAで複数行の選択

    エクセル2002使用です。 VBAで変数を使って複数行の選択で、6行目から9行目までを選択したいのです。 sub macro2() Dim rw As Integer rw=8 Rows("rw - 2:rw + 1").Select end sub だとエラーになります。 Rows("6:9").Select のようにしたいのですがどこが悪いのでしょうか? よろしくお願いします。

専門家に質問してみよう