DataGridのデータをマルチ選択、カンマ区切りで保存する

2010年8月27日(金)
PROJECT KySS

ロジックコードを記述する

リスト4のようにロジックコードを記述します。

リスト4: ロジックコード(MainPage.xaml.vb)

LINQ to XMLでXMLを処理するクラスの含まれるSystem.Xml.Linq名前空間をインポートします。StringBuilderクラスを使って文字列の追加を行いますので、このクラスの含まれるSystem.Text名前空間をインポートします。また、ファイルの入出力に関するクラスの含まれるSystem.IO名前空間もインポートしておきます。

PersonalInfoクラス内に「氏名、年齢、住所、勤務先」のプロパティを定義しておきます。

新しいStringBuilderのインスタンス、myDataとgridHeaderメンバ変数を宣言します。StringBuilderクラスは、文字を追加、削除、置換または挿入して値を作成した後に、その値を変更できるクラスです。

■ページが読み込まれた時の処理

XElement.LoadメソッドでXML文書ファイル(sampleData.xml)を読み込みます。要素のコレクションを取得するクエリ(query)を定義します。PersonalInfoクラスの新しいリストとして作成するmyPersonalInfoを宣言します。

queryを実行します。クエリコレクション内を反覆処理しながら、PersonalInfoクラスの各プロパティ(「氏名」、「年齢」、「住所」、「勤務先」)に、、、、要素の値を追加します。DataGridコントロールのItemsSourceにmyPersonalInfoオブジェクト指定します。DataGridコントロールにXMLデータがバインドされて表示されます。

StringBuilderクラスのインスタンスとして生成した、gridHeaderオブジェクトに、AppendメソッドでDataGridのヘッダの値を、カンマ区切りで、追加しておきます。このままだと末尾にもカンマが追加されますので、末尾のカンマは削除する処理を行います。

■DataGridコントロールのデータ項目が選択された時に発生するイベント

選択されたPersonalInfoクラスの「氏名」、「年齢」、「住所」、「勤務先」をカンマ区切りで、StringBuilderのインスタンスmyDataにAppendメソッドで追加していきます。

■ContextMenuから「コピー」が選択された時の処理

myData変数内の文字列をクリップボードに格納します。SetTextメソッドはクリップボード内にUnicodeテキストを格納するメソッドです。

■ContextMenuから「貼り付け」が選択された時の処理

クリップボードの中が空でない場合は、GetTextメソッドでクリップボード内のデータにアクセスして、TextBox1内にデータを貼り付けます。

■DataGridコントロール内で、マウスの右ボタンが押されたときの処理

マウスの右ボタンでクリックされたXとYの位置を、変数myXとmyYに格納しておきます。 SetValueメソッドで、ContextMenuコントロールの表示位置を設定し、ContextMenuコントロールのIsOpenメソッドにTrueを指定してContextMenuを表示します。アイコン付きのメニュー項目(コピー、貼り付け)が表示されます。

■TextBoxコントロール内で、マウスの右ボタンが押されたときの処理

e.Handled = Trueと記述することで、Silverlight標準の「Silverlight(S)」のメニューが出なくなります。

マウスの右ボタンでクリックされたXとYの位置を、変数myXとmyYに格納しておきます。 SetValueメソッドで、ContextMenuコントロールの表示位置を設定し、ContextMenuコントロールのIsOpenメソッドにTrueを指定してContextMenuを表示します。アイコン付きのメニュー項目(コピー、貼り付け)が表示されます。[保存]ボタンの使用を可能にします。

■[保存]ボタンをクリックしたときの処理

新しいSaveFileDialogのインスタンス、mySaveFileDialogオブジェクトを生成します。 フィルタにCSVファイルを指定し、DefaultExtプロパティに既定のファイル名拡張子csvを指定します。

mySaveFileDialogオブジェクトのShowDialogメソッドがTrueの場合は、mySaveFileDialogの、OpenFileメソッドで開かれたファイルと文字コードで初期化された、新しいStreamWriterのインスタンスwriterオブジェクトを生成します。Writeメソッドでヘッダを追加してTextBox1コントロールの内容をストリームに書き込みます。StreamWriterを閉じ、保存した旨のダイアログボックスを表示します。

全10回の連載はこれで終わりです。いかがでしたか?

関心を持ったサンプルを、ぜひ実際に開発して、Silverlight 4の可能性を考えてみていただければと思います。また、前回、今回のサンプルとも、データにXMLを使用しましたが、WCF RIA Servicesを使えば、SQL Serverデータベースの利用も可能です。機会があれば、またご紹介したいと思います。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています