locked
DataGridのデータの保存を確定する前に、確認のダイアログを出したい RRS feed

  • 質問

  • お世話になっております。

    Silverlight & WCF RIA Services & DataGridを使って、データベースへデータを書き込む
    アプリを作成しています。データを確定するために、下記のXAMLに示すような「保存」ボタンを
    作成しました。「キャンセル」ボタンも作成しています。

    ここで、保存やキャンセル自体はうまく動くのですが、「保存」ボタンを押したときに、データを
    更新することの確認のダイアログを出し、「OK」を押したときだけ保存をできるようにしたいのですが、
    作成したプログラムでは、「Cancel」を押しても保存されてしまいます。

    Clickイベントハンドラで登録したイベントを、イベントの起動先で無効にすることはできますでしょうか?

    (XAMLの一部)
    <Button Content="保存" Height="20" Width="60" Margin="10,0" Command="{Binding ElementName=tbl_staffDomainDataSource, Path=SubmitChangesCommand}" Click="Save_Click"/>
    <Button Content="キャンセル" Height="20" Width="60" Command="{Binding ElementName=tbl_staffDomainDataSource, Path=RejectChangesCommand}" />

    (C#のコードの一部)
    private void Save_Click(object sender, RoutedEventArgs e)
    {
        MessageBoxResult mbr = MessageBox.Show("データを更新しますか?", "確認", MessageBoxButton.OKCancel);
        if (mbr == MessageBoxResult.Cancel)
            {
                return;
            }
    }

    2011年10月19日 7:51

回答

  • 自力で解決できました。

    (XAMLの部分)
    <Button x:Name="SaveButton" Content="保存" Height="20" Width="60" Margin="10,0" Command="{Binding ElementName=tbl_staffDomainDataSource, Path=SubmitChangesCommand}" />

    (C#の部分)
    private void tbl_staffDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
    {
        SaveButton.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(Save_MouseLeftButtonDown), true);
            if (e.HasError)
            {
                System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);
                e.MarkErrorAsHandled();
            }
    }

    private void Save_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBoxResult mbr = MessageBox.Show("データを更新しますか?", "確認", MessageBoxButton.OKCancel);
        if (mbr == MessageBoxResult.Cancel)
            {
                e.Handled = true;
                return;
            }
            else
            {
                SaveButton.Command.Execute(null);
               return;
            }
    }

    XAMLにイベントハンドラを直接書かず、AddHandlerを使えば良かったようです。

    下記のサイトか参考になりました。
    http://d.hatena.ne.jp/wave1008/20101103

    2011年10月21日 2:14

すべての返信

  • 保存ボタンには、CommandへのBindingとClickイベントハンドラの2つが定義されているため、両方の処理が別々に起きているのではないでしょうか?

    SubmitChangesCommand の中で、MessageBoxを表示して、その結果がMessageBoxResult.OK だったら保存処理を行う、というように記述するのはどうでしょうか。

    2011年10月19日 9:14
  • ご返事いただき、どうもありがとうございます。

    その方法を検討してみましたが、SubmitChangesCommandは、DomainDataSourceクラスの
    プロパティとして既にライブラリ化されており、追記(というか変更)できないと思います。
    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.domaindatasource.submitchangescommand(v=vs.91).aspx

    プロパティをオーバロードできるのなら、そうしたいのですが.......

    2011年10月20日 0:55
  • イベントハンドラをClickからMouseLeftButtonDownに変更してみました。

    <Button Content="保存" Height="20" Width="60" Margin="10,0" Command="{Binding ElementName=tbl_staffDomainDataSource, Path=SubmitChangesCommand}" MouseLeftButtonDown="Save_MouseLeftButtonDown" />

    private void Save_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBoxResult mbr = MessageBox.Show("データを更新しますか?", "確認", MessageBoxButton.OKCancel);
        if (mbr == MessageBoxResult.Cancel)
            {
                e.Handled = true;
                return;
            }
    }

    これでうまくいくかなと思っていましたが、今度はイベント自体が起動しません。どうしてでしょうか?

    2011年10月21日 1:28
  • 自力で解決できました。

    (XAMLの部分)
    <Button x:Name="SaveButton" Content="保存" Height="20" Width="60" Margin="10,0" Command="{Binding ElementName=tbl_staffDomainDataSource, Path=SubmitChangesCommand}" />

    (C#の部分)
    private void tbl_staffDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
    {
        SaveButton.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(Save_MouseLeftButtonDown), true);
            if (e.HasError)
            {
                System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);
                e.MarkErrorAsHandled();
            }
    }

    private void Save_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBoxResult mbr = MessageBox.Show("データを更新しますか?", "確認", MessageBoxButton.OKCancel);
        if (mbr == MessageBoxResult.Cancel)
            {
                e.Handled = true;
                return;
            }
            else
            {
                SaveButton.Command.Execute(null);
               return;
            }
    }

    XAMLにイベントハンドラを直接書かず、AddHandlerを使えば良かったようです。

    下記のサイトか参考になりました。
    http://d.hatena.ne.jp/wave1008/20101103

    2011年10月21日 2:14