はじめに
Windows Formsプログラミングで普段よく使われるコントロールの一つにDataGridViewがあります。DataGridViewは、Windows Forms 2.0で新たに登場したコントロールで、Windows Forms 1.0のDataGridコントロールの後継となるものです。非常に強力で用途の広いコントロールであり、各種のデータソースを表形式で表示するのに向いています。柔軟性が高いゆえに、公開されているプロパティ、メソッド、イベントも多数にのぼり、初心者にはかなり取っ付きにくいコントロールと言えます。
本稿は、プログラミングの現場でDataGridViewコントロールをすぐ使いこなせるようにすることを目指しています。一般的なタスクをほぼカバーするよう努めましたが、DataGridViewコントロールの全機能を網羅しているわけではありません。
本稿では、WindowsアプリケーションプロジェクトのデフォルトのフォームForm1にDataGridViewコントロールを配置するものと仮定します(図1)。
それではさまざまなテクニックを見ていきましょう。
配列をバインドする
DataGridViewコントロールに配列をバインドすることができます。次の例を見てください。
Dim arr() As String = _ {"Product 1", "Product 24", "Product 356"} DataGridView1.DataSource = arr
arr()
は3個の要素を持つ文字列配列です。DataSource
プロパティを用いてDataGridViewコントロールにバインドされています。図2に、このデータバインドの結果を示します。
この結果は意外なものかもしれません。おそらく、配列の各要素が表示されると予想していた人が多いのではないでしょうか。実際には、各要素の長さが表示されます。DataGridViewコントロールはバインドされたオブジェクトの最初のパブリックプロパティを探すからです。この例では、文字列配列の最初のパブリックプロパティは配列内の各要素の長さなので、上のような結果が得られるわけです。
文字列配列をDataGridViewコントロールに正しくバインドするためには、次に示すように文字列型をラップするクラスを作成し、このクラスが、要素の内容を返すパブリックプロパティName
を公開するようにします。
Public Class CStringItem Private _str As String Public Sub New(ByVal str As String) _str = str End Sub Public Property Name() As String Get Return _str End Get Set(ByVal value As String) _str = value End Set End Property End Class
次の例では、arr()
をCStringItem型の配列として宣言し、3個の要素を初期設定した後で、DataGridViewコントロールにバインドします。
'---modified array--- Dim arr() As CStringItem = { _ New CStringItem("Product 1"), _ New CStringItem("Product 2"), _ New CStringItem("Product 3")} DataGridView1.DataSource = arr
図3は、このデータバインドの結果です。パブリックプロパティName
がDataGridViewコントロール内の列の見出しテキストとして使われていることに注意してください。
カスタムオブジェクトをバインドする
次の例では、DataGridViewコントロールにもっと複雑なオブジェクトをバインドする方法を説明します。2つのパブリックプロパティ(Name
、ID
)を持つCStudent
クラスを定義します。
Public Class CStudent Private _name As String Private _ID As String Public Sub New(ByVal id As String, ByVal name As String) _ID = id _name = name End Sub Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property Public Property ID() As String Get Return _ID End Get Set(ByVal value As String) _ID = value End Set End Property End Class
DataGridViewコントロールにCStudent
オブジェクトの配列をバインドすると、図4の結果が得られます。
'---binding to custom object--- Dim students() As CStudent = _ {New CStudent("123-456-789", "John"), _ New CStudent("456-123-789", "Mary")} DataGridView1.DataSource = students