トップ回答者
DataGridのデータの保存を確定する前に、確認のダイアログを出したい

質問
-
お世話になっております。
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- 回答としてマーク kawata_sotaro 2011年10月21日 2:14
2011年10月21日 2: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- 回答としてマーク kawata_sotaro 2011年10月21日 2:14
2011年10月21日 2:14