DataGrid以上の使いやすさを実現するFlexGrid for Silverlight
業務用アプリケーションでは、一覧表示が必要になる事がよくあります。業務用アプリケーションでは、画面の使いやすさと同時に、作業効率という面も重要な評価ポイントであり、“一覧性”はその重要なファクターになるからです。
Silverlightにも一覧表示用にDataGridコントロールがあります。各種データをデータソースとして連結して手軽に一覧表示はできるのですが、データ連結しなければ一覧表示する事ができないなど、凝ったことをやろうとすると、XAMLに対するスキルなどを身に付けていないと実現が難しいときもあります。有識者にとっては「XAMLでできるよ」「一度IEnum・・・で○○してから使えばできるよ」と簡単に説明できる事でも、実は多くの基礎ノウハウがあってこその簡単さだったりします。
今回紹介するFlexGrid for Silverlightは、様々な設定をプロパティで行えるため、シンプルな操作で目的のデザインを構築できる、使いやすいコンポーネントです。今回は、まずDataGridでTwitter上からハッシュタグのついたTweetを一覧表示する画面を作り、それをFlexGridに移行します。そして、最後に両者の使い勝手を比較してみたいと思います。なお、説明箇所ごとの実装をサンプルソース内に入れてあるので、適宜参照してください。
DataGridで一覧表示画面を実装
まずは、DataGridで一覧表示画面を実装していきます。
DataGridでの一覧表示画面のデザイン
ButtonとDataGridを画面上に配置して、Buttonをクリックした時にデータを取得して一覧表示するUIは、次のようなXAML定義になります。
<Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal"> <Button x:Name="Get_Button" Content="取得" Width="100" Click="Get_Button_Click" /> </StackPanel> <sdk:DataGrid Grid.Row="1" AutoGenerateColumns="True" HorizontalAlignment="Left" x:Name="Result_DataGrid" VerticalAlignment="Top" Height="227" Width="500"> </sdk:DataGrid> </Grid>
DataGridの定義の重要な点は、次の2点になります。
- AutoGenerateColumnsを「
True
」にして、連結したデータソースに合わせて自動的にカラム生成 - 「
x:Name
」として「Result_DataGird」を設定し、コードからDataGridを操作できるように設定
XAMLで定義した画面を操作したときのイベントとプロシージャを関連づける記述は、2種類の書き方ができます。今回は、XAML側でButtonに対して「Click="Get_Button_Click"
」と記述していますが、コード側で「Handles Get_Button.Click
」をプロシージャ宣言に追記しても同じ事が可能です。
DataGridにおける一覧表示させるためのコード
Silverlightでは、HTTP通信はすべて非同期で行うため、DownloadStringAsyncを使ってリクエストを送信し、DownloadStringCompletedイベントによりレスポンスを取得します。
Imports System.Runtime.Serialization.Json Imports System.Text Partial Public Class MainPage Inherits UserControl Private WithEvents Webs As New System.Net.WebClient Private Const URL As String = "http://hatsune.wankuma.com/service/CZ1103_search.aspx" Public Sub New() InitializeComponent() End Sub Private Sub Get_Button_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Call GetRecords() End Sub Private Sub GetRecords() Call Webs.DownloadStringAsync(New Uri(URL)) Me.Get_Button.IsEnabled = False Me.Cursor = Cursors.Wait End Sub Private Sub Webs_DownloadStringCompleted(sender As Object, e As DownloadStringCompletedEventArgs) _ Handles Webs.DownloadStringCompleted Me.Get_Button.IsEnabled = True Me.Cursor = Cursors.Arrow If e.Error IsNot Nothing Then MessageBox.Show(e.Error.Message) Else Dim serializer As New DataContractJsonSerializer(GetType(TSearchResult)) Using stream As New System.IO.MemoryStream(Encoding.UTF8.GetBytes(e.Result)) Dim result As TSearchResult = CType(serializer.ReadObject(stream), TSearchResult) Dim view As New Data.PagedCollectionView(result.results) view.SortDescriptions.Add(New ComponentModel.SortDescription("create_at", ComponentModel.ListSortDirection.Descending)) Me.Result_DataGrid.ItemsSource = view End Using End If End Sub Public Class TSearch Public Property created_at As String Public Property from_user As String Public Property text As String End Class Public Class TSearchResult Public Property results As List(Of TSearch) End Class End Class
一覧表示の実行
XAML側とコード側が完成したら実行してみましょう。
IDEから実行すれば自動的にWebブラウザが立ち上がり、その中でSilverlightが読み込まれて画面が表示されます。[取得]ボタンをクリックすると、「#wp7jp」のハッシュタグがついたTwitterの発言を一覧表示します。
次に、FlexGridを使った場合の実装方法を見ていきたいと思います。