2010-01-18 133 views
8

我有一个窗体,它托管一个tabcontrol。 这些标签中的每一个都有很多控件,从文本框,组合框,树控件,旋转控件。在winform中跟踪更改C#

在窗体顶部有一个文本框。

如果有任何使用表单控件进行的更改,比如表单控件的组合框中的值发生了更改,或者某个项目从树形控件中删除了,我需要显示一个表示某些值已经存在的“*”改变。

我如何以有效的方式实现这一目标? 或正在处理响应。控制更改的事件是唯一的方法来知道项目是否更改?

+0

这可能有助于了解一点关于如何使用这些信息是一直存在的“状态”的变化对一个给定的TabPage:如果出现了控制设置/属性的变化,你是做什么在用户被允许切换到另一个TabPage之前?像序列化控件一样,以某种方式保存属性数据? TommieB的答案给了你一个CodeProject文章下面的答案,因为这篇文章举例说明了监视状态变化的三种不同策略。 – BillW 2010-01-18 18:28:24

回答

4

我认为这篇关于Codeproject的文章可能对你有所帮助,它有助于追踪winforms控件的变化。

希望这会有所帮助。

+0

好文章!!!!! – gbianchi 2010-01-18 17:59:59

1

这完全取决于您的软件的基础架构。如果它是以一种天真的方式编写的,那么是的,某种形式的蛮力就是你能走的唯一途径(当然,这会让代码变得更糟 - 这就是为什么好的架构很重要)。

另一方面,如果软件设计合理,那么您将在用户界面后面有跟踪UI状态的对象。这些对象可能实现类似于INotifyPropertyChanged的东西,您可以利用它与映射机制来更新已更改字段的UI。

虽然我怀疑你陷入了第一种情况,但是在你现在要做的事情之前,你的问题的任何好的答案都会被消除。我从你的陈述中推断出这种形式是“托管一个tabcontrol”,并且“这些标签中的每一个都有很多控件......”这是一个UI反模式,我一次又一次地看到穷人设计师。

+0

为什么您将包含许多其他控件的选项卡控件描述为反模式?在设计方面,你会如何重构? – 2010-01-18 17:44:01

+1

@Neil:UserControl(s)。我已经看到大量可怕的软件直接在选项卡上打字(直接)几十个控件,基本上使'Form1'(它几乎不可避免地命名为“Form1”)成为所有状态的单个全局容器,而没有任何抽象感。 Form1中的成员用作全局状态(频率,甚至以'glb'为前缀)。我可以考虑一个特定的软件,我公司销售的软件价格高于10k美元/许可证,这些软件滥用了部分类来将Form1传播到11个带有“textBox74”控件的文件中。是的,有超过74个文本框。 – 2010-01-18 17:47:49

+1

我与之合作的那个人叫做“frmMain”。他们在项目中留下了Form1,而Form1的唯一目的是显示frmMain,然后关闭自己。 – 2010-01-18 18:07:56

1

您可以尝试沿着这些方向,您需要为表单上的每种类型的控件添加一点。在你的加载事件中做一个addUpdateNotification(this);

public void addUpdateNotification(Control start) 
    { 
     foreach (Control c in start.Controls) 
     { 
      if (c is TextBox) 
      { 
       var text = c as TextBox; 
       text.TextChanged += notifyChanged; 
      } 

      addUpdateNotification(c); 
     } 
    } 

    public void notifyChanged(Object sender, EventArgs args) 
    { 
     UpdateTextBox.Text = "*"; 
    } 
+1

@BillW你确定吗?它将从启动控制开始,经历所有控制的所有孩子。无限递归只有在子控件将其父项当作孩子时才会发生,而且该文章中的代码看起来会在相同的情况下窒息(我甚至不确定这种情况是否可行)。 – BarrettJ 2010-01-18 19:15:36

+0

@ Tester101固定,应该已经在下一行使用,而不是c.TextChanged – BarrettJ 2010-01-18 20:21:18

+0

@BarretJ我的歉意,你的代码不会产生递归:我违反了我自己的政策,不评论我没有亲自测试的代码:这将教我 ! – BillW 2010-01-21 18:08:47