警告多个文本框中的更改的简单方法是什么?

时间:2016-03-11 12:56:27

标签: c# .net winforms

我对编程很新,很抱歉,如果这很简单,但我可能只是错过了显而易见的事情!我有以下表格,它会在存储在INI文件中的设置加载时自动填充:

Configuration screen

整个表单的工作正如我希望它分开形成一个小部分。 '关闭'按钮当前只是关闭窗体,以便如果加载窗体后文本框中的任何值已更改,则更改将丢失。我想改为提示用户使用“保存”按钮,否则更改将丢失。

我一直试图在我的关闭按钮上沿着这些行做某事,其中文本框的值根据它们最初填充的变量值进行检查:

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个文本字段,我不确定这是否是最干净的方式"检查更改?任何指针将不胜感激。

4 个答案:

答案 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();