2009-07-13 71 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

你的代码看起来OK。你遇到了什么问题? – 2009-07-13 18:31:11

回答

0

那么我认为这个理论是好的。实施有一些问题。

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

     e.Cancel = false; 

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

    } 

我认为这将是一个很大similier写这篇文章:

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

循环的窗体控件,并添加您的活动观察家。这些事件将以一种形式调用函数,该函数将保持Hashtable或其他各种集合的最新状态以及对特定控件的任何更改的状态。

像我这样,哈希表的变化;

然后我的每一个事件被调用时,我说,添加Control.Name,然后改变状态,任何你想要的。然后你有一个已经更新的控件列表。

如果需要,我可以进入更多的细节,希望这会让你开始。

8

很大程度上取决于信息的保存位置。

如果您正在使用数据绑定的,你应该只是监视ListChanged事件或调用dataTable.GetChanges()如果你正在使用的DataTable。

如果信息来自类ICloneable和IComparable的实现,那么您可以在初始化表单时(以及在保存之后)采取备份副本,并在关闭时准备好课程以便保存并与原始文档进行比较。

否则,你可以这样做

声明一个私有变量

private bool requiresSaving =false; 

声明事件

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

胡克此事件的各种改变活动,如

this.txtNameDepart.TextChanged += new System.EventHandler(this.SomethingChanged); 

(实际事件有时被称为不同的东西,如的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()活动期间,您可以检查这些与当前值

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(); 
     } 
    } 
}