Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

WebサービスをバインドしたDataGridViewでソート処理を実装する

ソート機能を実装したBindingListの作り方

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/04/10 08:00

ダウンロード ソースコード (91.5 KB)

DataGridViewのソート機能は通常のオブジェクト配列をそのままバインドしただけでは利用することができません。スマートクライアントで利用されることが多いWebサービスなどで取得できるオブジェクトもオブジェクト配列を利用することが多いので、これでは不便です。本稿ではDataGridViewへバインドしたオブジェクトでソート機能を利用できるようにする手軽な方法を紹介します。

目次

はじめに

 WindowsフォームでDataGridViewを利用した一覧表示を実装すると表示項目の幅をユーザーが自由に変更したり、列の入れ替えを行ったり自由に表示をカスタマイズすることができます。また項目を選択してデータをソートすることも可能です。しかしこのソート機能は通常のオブジェクト配列をそのままバインドしただけでは利用することができません。スマートクライアントで利用されることが多いWebサービスなどで取得できるオブジェクトもオブジェクト配列を利用することが多いので、これでは不便です。本稿ではDataGridViewへバインドしたオブジェクトでソート機能を利用できるようにする手軽な方法を紹介します。

補足説明
 ASP.NETを利用してXML Webサービスを構築する場合、インターフェイスするデータの型にDataSetを利用することもできます。その場合は今回ご紹介する方法を使わなくともソート機能を利用することも可能です。本稿ではサーバサイドのテクノロジーに制限を受けないようにオブジェクトの配列型でのインターフェイスを想定した場合のソート機能について紹介します。

サンプルの説明

 サンプルは、Webサービスとクライアントプログラムに分かれています。本稿ではWebサービスを作成する手順については割愛させて頂きますが、作成手順についてはマイクロソフトの提供するXML Web サービスの作成とアクセスに関するチュートリアル(msdnライブラリ)のページを参照してください。

Webサービス

 サンプルのWebサービスは非常に簡単なものです。Bookクラスの配列を返すGetBookListメソッドを実装したBookServiceクラスを作成しました。

 受け渡されるBookクラスはISBN、Title、Author、Priceを属性として持っています。

Book.vbの抜粋
Imports Microsoft.VisualBasic

Public Class Book

    Public ISBN As String
    Public Title As String
    Public Author As String
    Public Price As Integer

End Class

 BookServiceGetBookListメソッドにはWebサービスとして公開するための<WebMethod> 属性を付与しています。本稿では記述を簡潔にするため、一覧を生成するようにコーディングしています。

BookService.vbの抜粋
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
補足説明
 本稿ではサンプルコードを簡潔にするため<WebService>属性、<WebServiceBinding>属性は省略しています。省略した場合、これらの属性によって設定できる値にはデフォルト値が設定されます。

クライアントプログラム

 クライアントプログラムとしてSampleFormクラスを作成しました。SampleFormには一覧を表示するDataGridViewと一覧取得のボタンを配置しています。

 ボタン押下時にWebサービスへアクセスし、取得したデータをDataGridViewへバインドします。

Webサービスで取得した一覧を直接バインドするSampleForm.vbの抜粋
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へのWebサービスのバインドは次の手順で行うと簡単に行うことができます。
  1. DataGridViewコントロールをFormに配置します。この段階ではまだヘッダーも表示されていません。
  2. フォームに配置された直後のDataGridViewコントロール
    フォームに配置された直後のDataGridViewコントロール
  3. DataGridViewの右上に表示されるスマートタグを開きます。Webサービスへのプロキシクラスを作成済みであれば「データソースの選択>他のデータソース>プロジェクト データソース」にプロキシクラスが表示されますので、そこからバインドするクラスを選択します。ここではBookクラスを選択しています。
  4. スマートタグを表示したDataGridViewコントロール
    スマートタグを表示したDataGridViewコントロール
  5. 設定が完了すると選択したクラスのBindingSourceが作成され、DataGridViewにヘッダーが表示されます。表示する項目の選択、編集の可否などもスマートタグから設定できます。
  6. ヘッダーが表示されたDataGridViewコントロール
    ヘッダーが表示されたDataGridViewコントロール
 ここまで設定が終われば、上記コーディング例の通り、DataGridViewのDataSouceにオブジェクトを設定するだけで一覧が表示されるようになります。

実行例

 実行時の画面は次のようになります。

サンプルアプリケーションの実行画面
サンプルアプリケーションの実行画面

 このとき表示された一覧のヘッダをクリックしてもデータはソートすることができません。

補足説明
 DataGridViewではソートのモードが用意されていますが、オブジェクト配列の場合はモードを設定してもソートすることはできません。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 奥山 学(オクヤマ マナブ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2012年2月時点での登録メンバは37名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

おすすめ記事

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5