DataFormの編集と新規データの追加

2010年8月24日(火)
PROJECT KySS

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

ソリューションエクスプローラ内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックしてコード画面を開きます。

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

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

XML to LINQでXMLを処理するクラスの含まれるSystem.Xml.Linq名前空間をインポートします。ファイルの入出力に関するクラスの含まれるSystem.IO名前空間をインポートします。また、エンティティ クラスのメタデータを定義するために使用される属性クラスを提供する、System.ComponentModel.DataAnnotations名前空間をインポートしておきます。

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

「ID」の値を保持するプロパティに対して、RequiredAttribute 属性(必須項目)を適用します。データが不正な場合はErrorMessageが表示されます。

検証する型に関する情報を提供する、ValidationContextの新しいインスタンスmyValidationContextオブジェクト(検証対象オブジェクトで初期化されている)を生成します。

ValidationContextのパラメータは下記の通りです。

ValidationContext(検証対象オブジェクト,サービスプロバイダー(ここではNothingを指定),検証に関連する値のコレクション(ここではNothingを指定))

検証するメンバのプログラム名をMemberNameプロパティで指定します。ここでは”ID”を指定しています。関連付けられているValidationAttribute 属性の値を検証するValidatorの、ValidatePropertyメソッドで、指定されたプロパティの値が有効であるかどうかを判別します。

「年齢」の値を保持するプロパティに対してRangeAttribute 属性(データが指定された数値の範囲内にあるかどうかを検証)を適用しています。データが不正な場合はErrorMessageが表示されます。検証する型に関する情報を提供する、ValidationContextの新しいインスタンスmyValidationContextオブジェクト(検証対象オブジェクトで初期化されている)を生成します。検証するメンバのプログラム名をMemberNameプロパティで指定します。ここでは”年齢”を指定しています。

関連付けられているValidationAttribute 属性の値を検証するValidatorの、ValidatePropertyメソッドで、指定されたプロパティの値が有効であるかどうかを判別します。

SexListクラス内でString型の新しいリストであるmySexListを宣言しておきます(A)。

String型のリストである、読み取り専用のsexInfoプロパティを定義します。その中で、mySexListオブジェクトにAddメソッドで「男性」、「女性」の項目を追加しておきます。この追加されたmySexListオブジェクトを戻り値とします。この値が、DataFormの「性別」セルにレイアウトされたComboBoxコントロールに表示されます。

■(A)

PesonalInfoクラスの新しいリストとして作成するmyPersonalInfoをメンバ変数として宣言します。

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

DataFormにデータをバインドするDataShowプロシジャを実行します。

■DataFormにデータをバインドする処理

IsRunningOutOfBrowserプロパティでアプリケーションがブラウザ外で実行されているかどうかをチェックし、HasElevatedPermissionsプロパティで、アプリケーションが高い信頼性のあるブラウザ外で動作しているかをチェックします。

ブラウザ外で実行されず、高い信頼性に基づいていない場合は、メッセージボックスを表示します。

ブラウザ外で実行され、高い信頼性に基づいている場合は、以下の処理を実行します。

Path.CombineメソッドでMyDocumentsフォルダのパスと、personalInfo_ID_sex_2.xmlのファイル名を連結し、変数filePathに格納します。MyDocumentsフォルダ内にpersonalInfo_ID_sex_2.xmlというファイルがない場合は、メッセージボックスを表示します。

新しいStreamReaderのインスタンスである、readerオブジェクトを生成します。ReadToEndメソッドでファイルの内容を読み取ります。読み取った内容を変数xmlDataに格納します。StreamReaderを閉じます。StreamReaderクラスは、標準テキストファイルから情報の行を読み込みます。つまり、読み込み可能なファイルは、テキスト形式のファイルに限られます。

XElement.Parseメソッドで、xmlDataに格納されたXML情報を読み取ります。ParseメソッドはXMLを格納した文字列からXElementを読み取ります。読み取ったXML情報から、要素のコレクションを取得するクエリ(query)を定義します。myPersonalInfoオブジェクト内をClearメソッドで一度クリアしておきます。このコードを記述しておかないとデータの追加や編集保存を繰り返しているとエラーが発生する場合があります。

queryを実行します。クエリコレクション内を変数resultで反復処理しながら、以下の処理を実行します。

PersonalInfoクラスのリストとして作成した、myPersonalInfoオブジェクトのAddメソッドで、PersonalInfoクラスの各プロパティ(「ID」、「氏名」、「年齢」、「性別」、「住所」、「勤務先」)に、XML要素(、、、、、)の値を追加します。DataFormコントロールのItemsSourceプロパティにmyPersonalInfoオブジェクトを指定します。DataFormコントロールにXMLデータがバインドされます。

■データの新規追加アイコン[+]をクリックしたときの処理

データの修正か、追加保存かを判別するメンバ変数noにTrueを指定します。noがTrueの場合はデータの追加保存を意味します。DataFormのカレントアイテムのインデックを取得する、CurrentItemプロパティに1を指定します。一時的に2ページ目(インデックスは0から開始のため)を選択させます。この処理を記述しておかなければ、新規にデータを追加する[+]アイコンをクリックした際、ツールバーの使用が不可になってしまいます。これを防ぐため、DataFormの2ページ目を一時的に選択させます。

■ComboBoxから項目が選択された時の処理

FindNameInContentメソッドで、指定された名前(mySex)を持つComboBoxオブジェクトから、選択された項目をメンバ変数selectSexに格納しておきます。

■[編集保存]ボタンがクリックされた時の処理

メンバ変数noの値がTrue(追加保存の場合)のときに、[編集保存]ボタンがクリックされた場合は、メッセージを表示します。

DataFormのカレントアイテムのインデックスを変数myIndexに格納します。

FindNameInContentメソッドで、指定された名前をもつDataForm内のTextBoxを参照します。「年齢」に入力された値が0より小さく120より大きい場合は警告メッセージを表示します。

変数myIndexに該当する要素の各子要素を参照します。Valueプロパティで、参照した各要素の値に、DataForm内のTextBoxの値を指定します。

「ID」の欄が空白でない場合は、ファイル名と文字コードで初期化された新しいStreamWriterのインスタンスである、writerオブジェクトを生成します。Writeメソッドで、編集修正されたXMLデータ(xmldoc.ToString)をストリームに書き込みます。StreamWriterを閉じます。

■[追加保存]ボタンがクリックされた時の処理

メンバ変数noの値がFalse(編集保存の場合)のときに、[追加保存]ボタンがクリックされた場合は、メッセージを表示します。

DataFormのカレントアイテムのインデックスを変数myIndexに格納します。

FindNameInContentメソッドで、指定された名前をもつDataForm内のTextBoxを参照します。「ID」が未入力であったり、「年齢」に入力された値が0より小さく120より大きい場合は警告メッセージを表示します。

ファイル名と文字コードで初期化された新しいStreamWriterのインスタンスである、writerオブジェクトを生成します。New XElementコンストラクタで要素を生成し、その子要素として、、、、、要素を生成します。これら子要素の値は参照しておいた、DataForm内の各TextBoxの値です。「性別」の値だけは、ComboBoxから選択された値を保持している変数、selectSexの値になります。Addメソッドで、生成したXMLデータをxmldocオブジェクトに追加します。Writeメソッドで、新規データの追加されたXMLデータ(xmldoc.ToString)をストリームに書き込みます。StreamWriterを閉じます。DataFormに追加したデータをバインドするために、DataShowプロシージャを実行します。

■編集が開始された時に発生するイベント

メンバ変数noの値がTrueのとき、すなわち、追加保存の場合は、[編集保存]ボタンの使用を不可とし、編集時に[編集保存]ボタンの使用を可能にします。

■削除アイコン[-]が選択された時の処理

DataFormのカレントアイテムのインデックスを変数myIndexに格納します。FindNameInContentメソッドで、指定された名前(myID)をもつDataForm内のTextBoxを参照します。MessageBox.ShowメソッドでIDに該当するデータを削除するかどうかの確認メッセージ([OK]と[キャンセル]付き)を表示します。

[OK]ボタンをクリックした場合は、ファイル名と文字コードで初期化された新しいStreamWriterのインスタンスwriterオブジェクトを生成します。インデックスに該当する要素を取得します。Removeメソッドで要素とその子要素を削除します。IDに該当する要素の削除されたXMLデータ(xmldoc.ToString)をWriteメソッドでストリームに書き出します。StreamWriterオブジェクトを閉じます。

[キャンセル]の場合は処理を中止します。

四国の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メルマガ会員のサービス内容を見る

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