DataGridのデータをマルチ選択、カンマ区切りで保存する
ロジックコードを記述する
リスト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データベースの利用も可能です。機会があれば、またご紹介したいと思います。