2009-07-13 45 views
4

私はC#でWindowsフォームアプリケーションを持っていますが、ユーザーが閉じると「変更を保存しますか?」というフォームがあります。私のフォームに変更を加えるにはどうすればいいですか?ここにいくつかのコードがあります:閉じる閉じる前に変更を保存閉じる

public partial class DepartEdit : Form 
{ 
    string _nameDep; //This variavel get value textbox when form load 

    { 
     InitializeComponent(); 
    } 
    private void DepartamentEdit_FormClosing(object sender, FormClosingEventArgs e) 
    { 


     if (txtNameDepart.Text != _nameDep && codDepartament > 0)//Here i compare 
     { 
      DialogResult dlg = MessageBox.Show("Save changes?", "Question", MessageBoxButtons.YesNo); 

      if (dlg == DialogResult.Yes) 
      { 
       saveDepart(); // Metod save depart 

       e.Cancel = false; 

      } 
      if(dlg ==DialogResult.No) 
      { 
       e.Cancel = false; 

      } 

     }   
} 

多くのテキストボックスとコンボボックスがありますか?フォームに変更を加える他の方法はありますか?

+0

に対してこれらを確認することができます。あなたはどんな問題に遭遇しましたか? –

+0

@ Meta-Knight最後の行からは、フォーム上の多数のコントロールを使って変更をチェックする方法を聞いているようです。 – statenjason

答えて

0

私は理論が良いと思います。実装にはいくつかの問題があります。

if(dlg == DialogResult.Yes) 
    { 
      saveDepart(); 
    } 
    // You don't need to change e.Cancel to false here unless you set it to true previously. 
1

ループフォームコントロール、およびあなたのイベントウォッチャーを追加します。

if (dlg == DialogResult.Yes) 
    { 
     saveDepart(); // Metod save depart 

     e.Cancel = false; 

    } 
    if(dlg ==DialogResult.No) 
    { 
     e.Cancel = false; 

    } 

私はこれを書くために、多くのsimilierになると思います。これらのイベントは、特定のコントロールへの変更のステータスに合わせてHashtableまたはその他のさまざまなコレクションを最新の状態に保つフォーム内の関数を呼び出します。

私には、ハッシュテーブルの変更があります。

私のイベントが呼び出されるたびに、私は、Add Control.Nameと言う、あなたが望むものであれば、ステータスを変更します。次に、更新されたコントロールの一覧が表示されます。

必要に応じてもっと詳しく説明します。うまくいけば、これはあなたを始められるでしょう。

8

多くの情報は、情報の保存場所によって異なります。

DataTableを使用している場合は、DataTableを使用している場合は、listChangedイベントを監視するか、dataTable.GetChanges()を呼び出すだけで済みます。

ICloneableとIComparableを実装するクラスから情報が得られた場合は、フォームの初期化(保存後)と保存時にクラスを準備して元のデータと比較するだけでバックアップコピーを取ることができます。

そうでない場合は、イベント

private void SomethingChanged(object sender, EventArgs e) 
{ 
     requiresSaving = true; 
} 

例えば

this.txtNameDepart.TextChanged += new System.EventHandler(this.SomethingChanged); 
、様々な変更されたイベントに、このイベントをフックアップを宣言し、何か

のようなプライベート変数を宣言し

private bool requiresSaving =false; 

を行うことができます

(実際のイベントは時々例えばにValueChanged、のSelectedIndexChanged、何か違うと呼ばれているが、彼らはあなたが何かを行うために、特定のイベントをSomethingChangedへのすべてのポイントを必要とすることができない限り。)

チェックフォーム

を閉じている、この変数
private void DepartamentEdit_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (requiresSaving) 
    { 
     .... 

また、saveDepartメソッドでrequiresSaving falseを設定する必要があります。

また、コントロールが初期化されるときにタグ値も設定され、formclosingイベントが各コントロールをループし、元の値(タグオブジェクト内)と現在の値を比較するコードがあります。

3

Form_Loadイベント内で文字列(または文字列[]と思います)を作成し、フォームが最初に開くときに値を初期化します。 例えば

string oName = nameTextBox.Text; 
string oCompany = companyComboBox.Text; 

その後Form_Closing()イベント中に、あなたはあなたのコードはOKと思われる現在の値

private void Contact_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (oName!=nameTextBox.Text||oCompany!=companyComboBox.Text) 
    { 
     DialogResult result = MessageBox.Show("Would you like to save your changes", 
      "Save?", 
      MessageBoxButtons.YesNoCancel, 
      MessageBoxIcon.Stop); 
     if (result == DialogResult.Yes) 
     { 
      SaveFormValues(); 
     } 
     else if (result == DialogResult.Cancel) 
     { 
      // Stop the closing and return to the form 
      e.Cancel = true; 
     } 
     else 
     { 
      this.Close(); 
     } 
    } 
} 
関連する問題