我在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 :(得分: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.