はじめに
WindowsフォームでDataGridViewを利用した一覧表示を実装すると表示項目の幅をユーザーが自由に変更したり、列の入れ替えを行ったり自由に表示をカスタマイズすることができます。また項目を選択してデータをソートすることも可能です。しかしこのソート機能は通常のオブジェクト配列をそのままバインドしただけでは利用することができません。スマートクライアントで利用されることが多いWebサービスなどで取得できるオブジェクトもオブジェクト配列を利用することが多いので、これでは不便です。本稿ではDataGridViewへバインドしたオブジェクトでソート機能を利用できるようにする手軽な方法を紹介します。
サンプルの説明
サンプルは、Webサービスとクライアントプログラムに分かれています。本稿ではWebサービスを作成する手順については割愛させて頂きますが、作成手順についてはマイクロソフトの提供するXML Web サービスの作成とアクセスに関するチュートリアル(msdnライブラリ)のページを参照してください。
Webサービス
サンプルのWebサービスは非常に簡単なものです。Book
クラスの配列を返すGetBookList
メソッドを実装したBookService
クラスを作成しました。
受け渡されるBook
クラスはISBN、Title、Author、Priceを属性として持っています。
Imports Microsoft.VisualBasic Public Class Book Public ISBN As String Public Title As String Public Author As String Public Price As Integer End Class
BookService
のGetBookList
メソッドにはWebサービスとして公開するための<WebMethod> 属性を付与しています。本稿では記述を簡潔にするため、一覧を生成するようにコーディングしています。
Imports System.Collections.Generic Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols Public Class BookService Inherits System.Web.Services.WebService <WebMethod()> _ Public Function GetBookList() As Book() Dim book As Book() = New Book(9) {} book(0) = New Book book(0).ISBN = "4-7981-1257-2" book(0).Title = "独習ASP.NET2.0" book(0).Author = "山田祥寛" book(0).Price = 4179 '(中略) Return book End Function End Class
クライアントプログラム
クライアントプログラムとしてSampleForm
クラスを作成しました。SampleForm
には一覧を表示するDataGridViewと一覧取得のボタンを配置しています。
ボタン押下時にWebサービスへアクセスし、取得したデータをDataGridViewへバインドします。
Public Class SampleForm 'DataSouceに直接バインドした場合 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Me.BookBindingSource.DataSource = Me.BookService1.GetBookList End Sub End Class
- DataGridViewコントロールをFormに配置します。この段階ではまだヘッダーも表示されていません。
- DataGridViewの右上に表示されるスマートタグを開きます。Webサービスへのプロキシクラスを作成済みであれば「データソースの選択>他のデータソース>プロジェクト データソース」にプロキシクラスが表示されますので、そこからバインドするクラスを選択します。ここでは
Book
クラスを選択しています。 - 設定が完了すると選択したクラスのBindingSourceが作成され、DataGridViewにヘッダーが表示されます。表示する項目の選択、編集の可否などもスマートタグから設定できます。
実行例
実行時の画面は次のようになります。
このとき表示された一覧のヘッダをクリックしてもデータはソートすることができません。