none
Formを閉じる際に「保存されていないが良いか?」の確認メッセージを出したい RRS feed

  • 質問

  • DataSet と TextBox を BindingSource で連結した登録Formがあるのですが、

    Formを閉じる際、「保存されていないが良いか?」の確認メッセージを出したいと

    考えているのですが、なかなかうまくいかなくて。

     

    DataSet.GetChangesメソッドで、と考えたのですが、GetChangesメソッドを

    コールする前に、BindingSource.EndEditメソッドをコールする必要があるかと思うのですが、

    入力必須項目が未入力だったりすると、EndEditメソッドで

    「NoNullAllowedException: 列 'XXXXX' に Null を使用することはできません。」

    の例外が発生してしまうし。

     

    そこで、DataSet.EnforceConstraintsプロパティを一時的にfalseにして試みたのですが、

    EndEditメソッドは正常にコールでき、DataSet.GetChangesメソッドでも

    変更された行(テーブルの行)も取得できたのですが、今度は、

    DataSet.EnforceConstraintsプロパティ値をtrueに戻す事ができなくなってしまって。

    (ConstraintExceptionが発生)

     

    何か良い方法はないものでしょうか?

     

    皆様、ご教授願えませんでしょうか。

    宜しくお願い致します。

     

    環境:

    Windows Vista Ultimate

    Visual Studio 2005 Professional Edition SP1

    .NET Framework 2.0

    2008年2月26日 7:43

回答

  • EndEdit(EndEditメソッドに限らず)が発生した例外を状態の判断材料にする方式は

    やはり避けたいと考えます。

     

    で、代替案で、全フィールドを、DataRowVersionで、変更前、変更後の値を比較する

    方式でと考えています。

     

    ありがとうございました。

     

    2008年2月27日 23:47

すべての返信

  • 仕様を確認させてください。

     

    とあるレコードを編集中にフォームを閉じた場合、その変更は反映させたいですか?(変更として検知するかどうか)

    また、新規レコードを挿入中にフォームを閉じた場合、その変更は反映させたいですか?

     

    そこらへんの仕様を考えるところからはじめないといけない気がします。

    例えば、どちらも反映させないならば、EndEditは要りません。

    編集して他のレコードに移れば確定され、反映されます。

     

    2008年2月26日 11:44
  • はなはなはなさん、回答ありがとうございます。

     

    >とあるレコードを編集中にフォームを閉じた場合、その変更は反映させたいですか?(変更として検知するかどうか)

    >また、新規レコードを挿入中にフォームを閉じた場合、その変更は反映させたいですか?

     

    「反映」とは、「DataSetに保存する」という事でしょうか?

    DataSetへの反映は特にどちらでも良いです。

     

    >どちらも反映させないならば、EndEditは要りません。

    DataSet.GetChangesメソッドで、レコードへの変更の有無をチェックしようと考えていたのですが、

    EndEditをしないと、DataSet.GetChangesメソッドで何も取得できないのです。

     

    >編集して他のレコードに移れば確定され、反映されます。

    「他のレコードに」とはどういう意味でしょうか?

    グリッドの様な複数レコードがFormに表示されている訳ではなく、1レコードの各フィールドの値を

    Formにテキストボックスで表示しています。

    ですので、「他のレコードに移れば」の動作はできません。

     

    2008年2月27日 1:48
  •  ぶるーの さんからの引用

    「反映」とは、「DataSetに保存する」という事でしょうか?

    DataSetへの反映は特にどちらでも良いです。

     

    そうです。DataSetに保存するかどうかです。

     

     ぶるーの さんからの引用

    >どちらも反映させないならば、EndEditは要りません。

    DataSet.GetChangesメソッドで、レコードへの変更の有無をチェックしようと考えていたのですが、

    EndEditをしないと、DataSet.GetChangesメソッドで何も取得できないのです。

     

    では、反映させたいのですね。

    Try内でEndEditすればよいかと思います。

    新規行で途中までしか入力してなくて、という場合は、Catchで捕らえてEndEditしないことになります。

     

     ぶるーの さんからの引用

    >編集して他のレコードに移れば確定され、反映されます。

    「他のレコードに」とはどういう意味でしょうか?

    グリッドの様な複数レコードがFormに表示されている訳ではなく、1レコードの各フィールドの値を

    Formにテキストボックスで表示しています。

    ですので、「他のレコードに移れば」の動作はできません。

     

    では、ここの部分は無視してください。

    私が検証するのにBindingNavigatorを使ったからです。

    2008年2月27日 2:05
  • EndEdit(EndEditメソッドに限らず)が発生した例外を状態の判断材料にする方式は

    やはり避けたいと考えます。

     

    で、代替案で、全フィールドを、DataRowVersionで、変更前、変更後の値を比較する

    方式でと考えています。

     

    ありがとうございました。

     

    2008年2月27日 23:47