表单关闭时保存更改

时间:2009-07-13 18:27:12

标签: c#

我在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;

            }

        }        
}

有很多文本框和组合框?有没有其他方法来获取表单中的更改?

5 个答案:

答案 0 :(得分:10)

很多将取决于信息的保存位置。

如果您正在使用DataTable,那么您应该只监视listChanged事件或调用dataTable.GetChanges()。

如果信息来自实施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事件循环遍历每个控件并将原始值(在标签对象中)与当前值进行比较。 p>

答案 1 :(得分: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();
         }
     }
}

答案 2 :(得分:1)

循环表单控件,并添加事件监视器。这些事件将调用一个函数,该函数将使Hashtable或其他各种集合保持最新状态,以及特定控件的任何更改状态。

像我一样,Hashtable改变了;

然后每次调用我的事件时,我会说,添加Control.Name,然后改变状态,无论你想要什么。然后,您有一个已更新的控件列表。

如果需要,我可以详细介绍,希望这会让你开始。

答案 3 :(得分:1)

很简单 声明全局变量count = 0 现在,在您的表单上,您可能已经有一个“保存”按钮,因此只需在“保存”按钮单击事件上增加计数 现在在窗体关闭事件上,只需检查count的值是否为0即可要求用户通过消息框提醒来保存信息 如果它是1或大于1,则关闭表格 我希望你能得到

答案 4 :(得分:0)

我觉得这个理论很好。实施方面存在一些问题。

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

        e.Cancel = false;

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

    }

我认为写这篇文章会更加相似:

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