• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DataGridViewの行取得)

DataGridViewの行取得

このQ&Aのポイント
  • DataGridViewの行を取得するためのVB2010のコード
  • DataGridViewのDataSourceに設定されたコレクションのアイテムを指定して行のインデックスを取得する方法を検討
  • DataGridViewに表示されている行をテキストボックスに入力された名前で選択する機能

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

もう一ついい感じのものがありました。KeyedCollection クラスです。 Private Class Person を Public Class Person に変更して Public Class Form の外に出さなければなりませんが、 Public Class Form1 Private Class Persons Inherits System.Collections.ObjectModel.KeyedCollection(Of String, Person) Protected Overrides Function GetKeyForItem(ByVal item As Person) As String Return item.Name End Function Public Overloads Function IndexOf(ByVal name As String) As Integer Return MyBase.IndexOf(MyBase.Item(name)) End Function End Class Private _persons As Persons Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load _persons = New Persons _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 Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim name As String = TextBox1.Text Me.DataGridView1.Rows(_persons.IndexOf(name)).Selected = True End Sub End Class という感じでできます。

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms132438(v=vs.80).aspx
msx68000
質問者

お礼

回答ありがとうございます。 indexを勝手に振ってくれるわけですね。これは良さげです。

その他の回答 (4)

回答No.4

Person に Index プロパティーを追加してやれば Private Sub AddPerson(ByRef p As Person, ByVal key As String) p.Index = _persons.Count _persons.Add(p, key) End Sub でコレクションに追加して Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim p As Person = _persons.Item(Me.TextBox1.Text) Me.DataGridView1.Rows(p.Index).Selected = True End Sub とできます。 Person に Index プロパティーを追加するというのが設計思想に反するかもしれませんが…。

msx68000
質問者

お礼

回答ありがとうございます。 参考になります。 こういった機能が組み込まれていればいいんですけどね。

  • tissue001
  • ベストアンサー率21% (28/132)
回答No.3

すいません答えじゃないですが... 簡単なのは、CellFormattingイベントを使う。 ボタンを押した時に、それぞれセルのvalueにテキストボックスに入力されている値が 含まれているかInstr関数で判定。 含まれていれば、 .DefaultCellStyle.BackColorや .DefaultCellStyle.ForeColorを変更するとか... ただ、行番号(インデックス)のみを取得したいのであれば、 やはり、全行を確認するしかないのではないでしょうか...

msx68000
質問者

お礼

回答ありがとうございます。 データが多くなると全行確認したくないですが 仕方ないですね。

  • tissue001
  • ベストアンサー率21% (28/132)
回答No.2

No.1です。 ごめんなさい求めている答えじゃなかったですね^^;

msx68000
質問者

補足

回答ありがとうございます。 (もしあればですが・・・) Forを使わない方法をご教授いただきたく。

  • tissue001
  • ベストアンサー率21% (28/132)
回答No.1

datagridviewに主キーとなる列があるのなら... もしくは、テキストボックスに入力する値が、他にはない場合... '全行を比較 For Earc v As DatagridviewRow In Me.Datagridview.Rows   'テキストと列("名前")の値が同じならその行を選択状態にし、カレント行とする。   If Me.テキストボックス.Text = v.Cells("名前").Value Then     Me.datagridview.CurrentCell = v.Cells("名前")     v.Selected = True     Exit For   End If Next ただし、MultiSelectがTrueの場合は一旦datagridviewのカレント行を以下のように無くす必要があります。 Me.datagridview.CurrentCell = Nothing

関連するQ&A