我对编程很新,很抱歉,如果这很简单,但我可能只是错过了显而易见的事情!我有以下表格,它会在存储在INI文件中的设置加载时自动填充:
整个表单的工作正如我希望它分开形成一个小部分。 '关闭'按钮当前只是关闭窗体,以便如果加载窗体后文本框中的任何值已更改,则更改将丢失。我想改为提示用户使用“保存”按钮,否则更改将丢失。
我一直试图在我的关闭按钮上沿着这些行做某事,其中文本框的值根据它们最初填充的变量值进行检查:
private void btnClose_Click(object sender, EventArgs e)
{
if (txtName.Text != name || txtSchName.Text != schname || txtServer1.Text != svr1 etc etc etc)
{
Warn User changes will be lost, ask user if really OK to close?
if (User chooses to to close)
{
this.Close();
}
else
{
Go back to the config form;
}
}
else
{
this.Close();
}
有超过21个文本字段,我不确定这是否是最干净的方式"检查更改?任何指针将不胜感激。
答案 0 :(得分:4)
您只需添加一个全局布尔变量并为TextChanged事件编写处理程序
RiakClient(protocol='http', nodes=[
{'host': 'riak1', 'http_port': 8098},
{'host': 'riak2', 'http_port': 8098},
{'host': 'riak3', 'http_port': 8098},
{'host': 'riak4', 'http_port': 8098},
{'host': 'riak5', 'http_port': 8098}])
只需为要触发条件的每个文本框设置事件处理程序OnBoxesChanged。您可以通过Designer执行此操作,也可以在InitializeComponent调用后手动执行此操作
答案 1 :(得分:4)
您正在寻找的是Dirty Tracking。脏跟踪用于跟踪控件的状态。这是一种简单的可重用方法来跟踪您的控件
public class SimpleDirtyTracker
{
private Form _frmTracked;
private bool _isDirty;
public SimpleDirtyTracker(Form frm)
{
_frmTracked = frm;
AssignHandlersForControlCollection(frm.Controls);
}
// property denoting whether the tracked form is clean or dirty
public bool IsDirty
{
get { return _isDirty; }
set { _isDirty = value; }
}
// methods to make dirty or clean
public void SetAsDirty()
{
_isDirty = true;
}
public void SetAsClean()
{
_isDirty = false;
}
private void SimpleDirtyTracker_TextChanged(object sender, EventArgs e)
{
_isDirty = true;
}
private void SimpleDirtyTracker_CheckedChanged(object sender, EventArgs e)
{
_isDirty = true;
}
// recursive routine to inspect each control and assign handlers accordingly
private void AssignHandlersForControlCollection(
Control.ControlCollection coll)
{
foreach (Control c in coll)
{
if (c is TextBox)
(c as TextBox).TextChanged
+= new EventHandler(SimpleDirtyTracker_TextChanged);
if (c is CheckBox)
(c as CheckBox).CheckedChanged
+= new EventHandler(SimpleDirtyTracker_CheckedChanged);
// ... apply for other desired input types similarly ...
// recurively apply to inner collections
if (c.HasChildren)
AssignHandlersForControlCollection(c.Controls);
}
}
并在你的主体中
public partial class Form1 : Form
{
private SimpleDirtyTracker _dirtyTracker;
private void Form1_Load(object sender, EventArgs e)
{
_dirtyTracker = new SimpleDirtyTracker(this);
_dirtyTracker.SetAsClean();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// upon closing, check if the form is dirty; if so, prompt
// to save changes
if (_dirtyTracker.IsDirty)
{
DialogResult result
= (MessageBox.Show(
"Would you like to save changes before closing?"
, "Save Changes"
, MessageBoxButtons.YesNoCancel
, MessageBoxIcon.Question));
}
}
答案 2 :(得分:0)
如果您想保存例如用户设置,可以在属性中创建Settings 。
你可以这样得到它们:
string anyProperty = WindowsFormsApplication1.Properties.Settings.Default.TestSetting;
使用Save
- 方法保存它们:
WindowsFormsApplication1.Properties.Settings.Default.TestSetting = "Hello World";
WindowsFormsApplication1.Properties.Settings.Default.Save();
点击关闭按钮后,您可以调用Save
- 方法。
为了保存多个字符串属性,您可以创建类型为System.Collections.Specialized.StringCollection
的属性,这样您就可以创建一个属性而不是21。
答案 3 :(得分:0)
dirtytracer的一个缺点是,即使更改恢复到原始状态,它也会返回“脏”。如果您使用DataContext中的对象作为您的数据模型,则所有此任务都简化为:
bool changed = dataContext.SomeTables.GetModifiedMembers(someRow).Any();