ホーム > Silverlight, WCF RIA Services > WCF RIA Services:データ追加

WCF RIA Services:データ追加

WCF RIA Services  「らしい」データの追加方法のサンプルが見つけられず、情報をまとめるのに時間がかかってしまいました。
とりあえず自分なりに納得いく方法として下記にまとめてみます。
何点かまだ気に入らないところがあるんですけどね。。。

Silverlight側にSilverlight子ウィンドウを追加します。

 image

データソースウィンドウでPersonを詳細表示の状態にします。
idは自動的に追加される項目なので、下記のように[なし]の状態にします。

 image_3

この状態で子ウィンドウにPersonデータソースをドラッグ アンド ドロップします。
必要な入力項目が追加されます。

 image_4

personDomainDataSourceのAutoLoadプロパティをfalseにします。

子ウィンドウのコードを以下のように修正します。
修正箇所はコメントを入れているあたりです。

————————————————————————————————

using System.Windows;
using System.Windows.Controls;
using SilverlightApplication10.Web;

namespace SilverlightApplication10
{
    public partial class ChildWindow1 : ChildWindow
    {
        // データ保持のための変数
        Person p = null;

        public ChildWindow1()
        {
            InitializeComponent();
            // 新規Personインスタンスの作成/追加と入力欄への関連づけ
            p = new Person();
            ((DomainService1)personDomainDataSource.DomainContext).Persons.Add(p);
            grid1.DataContext = p;
        }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            // データの検証および追加
            personDomainDataSource.SubmitChanges();
            if (!p.HasValidationErrors)
                this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        private void personDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
        {

            if (e.HasError)
            {
                System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);
                e.MarkErrorAsHandled();
            }
        }
    }
}

————————————————————————————————

MainPage.xamlに「追加」ボタンを追加します。

 image_5

このボタンは「再取得」ボタンと同じように、データを更新しているときは使えないようにしたいと思います。
そのため、IsEnabledプロパティにソースとして「ElementName」-「PersonDomainDataSource」、パスとして「CanLoad」を設定します。
「追加」ボタンをダブルクリックし、以下のプログラムを記述します。

————————————————————————————————

private void button4_Click(object sender, RoutedEventArgs e)
{
    // 子ウィンドウのインスタンスを生成
    ChildWindow1 w = new ChildWindow1();
    // 子ウィンドウを閉じたときにデータを読み直し、最終ページを表示するよう設定
    w.Closed += (s, ev) =>
    {
        if (w.DialogResult == true)
        {
            personDomainDataSource.Load();
            dataPager1.PageIndex = dataPager1.PageCount;
        }
    };
    // 子ウィンドウの表示
    w.Show();
}

————————————————————————————————

なお、PersonCheck.shared.csの内容を以下のように変更しておきます。
mailの値が空文字でもnullでもエラーになるようにしています。
また、エラー時のエラー設定項目としてageとmailの項目を指定しています。

————————————————————————————————

using System.ComponentModel.DataAnnotations;

namespace SilverlightApplication10.Web
{
    public class PersonCheck
    {
        public static ValidationResult CheckAge_Mail(Person p)
        {
            if (p.age >= 20 && (p.mail == string.Empty || p.mail == null))
                return new ValidationResult("成人はメールアドレス必須です", new string[] {"age", "mail"});
            return ValidationResult.Success;
        }

    }
}

————————————————————————————————

これで動作のチェックができるようになりますが、気をつけないといけないのは、通常のデバッグ開始を実行してしまうと、検証のチェックにひっかかったときにエラーが発生したことを検知して動作が止まってしまうことです。
必ず「デバッグなしで開始」を実行します。

下図のように追加データの検証が行われます。

 image_6

 image_7

 image_8

なお、上記の動作確認を行っていると、どうもクライアント側だけで検証できずにサーバ上での検証が走っているように思われます。
逆に考えると、サーバ上で検証のプログラムを記述すると、特になにもしなくてもクライアント側にサーバ上で発生した検証エラーを伝えられることがわかります。

検証エラーがでなければ、データを正常に追加することができます。

 image_9

データを追加したあと、最終ページを表示するようにプログラムを記述しているつもりですが、どうも本来ページが増えるはずの動作のときに最終ページの1つ前のページしか表示されない、という状態になっています。
その点解消する方法がないか、調査は続けたいと思います。

カテゴリー:Silverlight, WCF RIA Services
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。