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

WCF RIA Services:データ追加の補足

前回のエントリの最後にこんなことを書いてます。

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

非同期処理に慣れている人ならすぐ原因に気づいたんでしょうねぇ。
データの読み直し(personDomainDataSource.Load();)が非同期で行われるため、正しい最終ページの値を持ってこれていないことが問題でした。
ここを修正します。

まずは修正前のプログラム

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

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();
}

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

これを次のように変えます。

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

private void button4_Click(object sender, RoutedEventArgs e)
{
    // 子ウィンドウのインスタンスを生成
    ChildWindow1 w = new ChildWindow1();
    // 子ウィンドウを閉じたときの処理を記述
    w.Closed += (s, ev) =>
    {
        if (w.DialogResult == true)
        {
            // データを読み直したときのイベントを追加
            personDomainDataSource.LoadedData += new EventHandler<LoadedDataEventArgs>(dataAdded);
            personDomainDataSource.Load();
        }
    };
    // 子ウィンドウの表示
    w.Show();
}

private void dataAdded(object sender, LoadedDataEventArgs e)
{
    // 最終ページに移動
    dataPager1.PageIndex = dataPager1.PageCount;
    // 子ウィンドウを閉じたとき以外に実行されないようデータを読み直したときのイベントを削除
    personDomainDataSource.LoadedData -= dataAdded;
}

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

このようにデータの読み直しが終了した時点に動作するイベントを追加し、その中で最終ページに移動することで正しく動作するようになります。

さて、本編はここまで。

このプログラムを書いてて思ったんですが、非同期処理がベースとなることで、イベントに関する理解は必須になってしまいますね。
また、上記のプログラム中では説明もせずにさらっと流してますが、匿名デリゲートをラムダ式に置き換えて簡単な記述にしている、なんてことをしてます。

自分でプログラムを書く分には、IntelliSenseが手伝ってくれることもあって難しいところはそうないんですが、このあたりを他人に説明しようとすると、、、大変だよなぁ。。。

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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