2012-10-31 20 views
3

我使用C#Windows窗體(.NET 3.5),並試圖在用戶修改任何限定的數據來實現功能詳細信息表單上的列,並嘗試關閉表單而不保存,系統應彈出我的消息「保存更改?」。能夠通知用戶索要「保存更改」,當用戶試圖關閉Windows窗體不保存

我知道我總是可以使用TextChanged事件爲Textbox等,但這需要多個事件編碼。我想使用特定的事件處理程序來檢測與我的BindingSource相關聯的任何字段中的值的更改。

我已經爲界這樣的我的專欄:

textbox1.DataBindings.Add("Text", this.bindingSource1, "dbcolumn_1", true); 

回答

0

定義on_closing事件處理程序; http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onclosing.aspx

在那裏啓動一個表單,詢問他們是否要保存並將其作爲對話框打開,以便強制關注該表單(鏈接中的示例代碼顯示如何完成所有這些操作)。

+0

謝謝您的答覆。我的表單中包含大約80個字段,包括TextBox,Combobox,複選框等,它們都綁定到BindingSource和DataTable。我希望找到一個解決方案,我可以只處理BindingSource或DataTable,而不是比較on_closing事件處理程序中的每個字段與其原始值,以檢查是否有任何更改。謝謝。 – AGR090808

1

會是這樣的工作?

  1. 在表單中定義changedFlag變量,默認值= false。

    private changedFlag = false; // form value(s) changed, check it on form close

  2. 把這個事件處理程序的退出按鈕,或者改編成形式收處理程序:

    if (this.changedFlag && MessageBox.Show("Save your changes before exit?", "Save changes?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
        { 
         this.Save(); 
        } 
    
  3. 創建一個函數,它控制容器和遞歸看起來通過其控制連接更改處理程序(在第4步中定義)。

    private void AddOnChangeHandlerToInputControls(Control ctrl) 
    { 
        foreach (Control subctrl in ctrl.Controls) 
        { 
         if (subctrl is TextBox) 
         { 
          ((TextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange); 
         } 
         else if (subctrl is CheckBox) 
         { 
          ((CheckBox)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange); 
         } 
         else if (subctrl is RadioButton) 
         { 
          ((RadioButton)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange); 
         } 
         else if (subctrl is ListBox) 
         { 
          ((ListBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange); 
         } 
         else if (subctrl is ComboBox) 
         { 
          ((ComboBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange); 
         } 
         else 
         { 
          if (subctrl.Controls.Count > 0) 
          { 
           this.AddOnChangeHandlerToInputControls(subctrl); 
          } 
         } 
        } 
    } 
    
  4. 創建一個一般的更改處理功能設置changedFlag =真

    private void InputControls_OnChange(object sender, EventArgs e) 
    { 
        this.changedFlag = true; 
    } 
    
  5. 只要你的控件都建(不知道你是否是動態做了,但是你在使用textbox1您所以我假設沒有),從第3步調用函數並傳入輸入的容器控件。

    AddOnChangeHandlerToInputControls(panelFormContainer);

通過使在表單控件容器你避免手動線爲每個控制變更處理程序。還有要記得修改保存()函數來重置changedFlag = false;