我有一个窗体,它托管一个tabcontrol。 这些标签中的每一个都有很多控件,从文本框,组合框,树控件,旋转控件。在winform中跟踪更改C#
在窗体顶部有一个文本框。
如果有任何使用表单控件进行的更改,比如表单控件的组合框中的值发生了更改,或者某个项目从树形控件中删除了,我需要显示一个表示某些值已经存在的“*”改变。
我如何以有效的方式实现这一目标? 或正在处理响应。控制更改的事件是唯一的方法来知道项目是否更改?
我有一个窗体,它托管一个tabcontrol。 这些标签中的每一个都有很多控件,从文本框,组合框,树控件,旋转控件。在winform中跟踪更改C#
在窗体顶部有一个文本框。
如果有任何使用表单控件进行的更改,比如表单控件的组合框中的值发生了更改,或者某个项目从树形控件中删除了,我需要显示一个表示某些值已经存在的“*”改变。
我如何以有效的方式实现这一目标? 或正在处理响应。控制更改的事件是唯一的方法来知道项目是否更改?
我认为这篇关于Codeproject的文章可能对你有所帮助,它有助于追踪winforms控件的变化。
希望这会有所帮助。
好文章!!!!! – gbianchi 2010-01-18 17:59:59
这完全取决于您的软件的基础架构。如果它是以一种天真的方式编写的,那么是的,某种形式的蛮力就是你能走的唯一途径(当然,这会让代码变得更糟 - 这就是为什么好的架构很重要)。
另一方面,如果软件设计合理,那么您将在用户界面后面有跟踪UI状态的对象。这些对象可能实现类似于INotifyPropertyChanged
的东西,您可以利用它与映射机制来更新已更改字段的UI。
虽然我怀疑你陷入了第一种情况,但是在你现在要做的事情之前,你的问题的任何好的答案都会被消除。我从你的陈述中推断出这种形式是“托管一个tabcontrol”,并且“这些标签中的每一个都有很多控件......”这是一个UI反模式,我一次又一次地看到穷人设计师。
为什么您将包含许多其他控件的选项卡控件描述为反模式?在设计方面,你会如何重构? – 2010-01-18 17:44:01
@Neil:UserControl(s)。我已经看到大量可怕的软件直接在选项卡上打字(直接)几十个控件,基本上使'Form1'(它几乎不可避免地命名为“Form1”)成为所有状态的单个全局容器,而没有任何抽象感。 Form1中的成员用作全局状态(频率,甚至以'glb'为前缀)。我可以考虑一个特定的软件,我公司销售的软件价格高于10k美元/许可证,这些软件滥用了部分类来将Form1传播到11个带有“textBox74”控件的文件中。是的,有超过74个文本框。 – 2010-01-18 17:47:49
我与之合作的那个人叫做“frmMain”。他们在项目中留下了Form1,而Form1的唯一目的是显示frmMain,然后关闭自己。 – 2010-01-18 18:07:56
您可以尝试沿着这些方向,您需要为表单上的每种类型的控件添加一点。在你的加载事件中做一个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 = "*";
}
这可能有助于了解一点关于如何使用这些信息是一直存在的“状态”的变化对一个给定的TabPage:如果出现了控制设置/属性的变化,你是做什么在用户被允许切换到另一个TabPage之前?像序列化控件一样,以某种方式保存属性数据? TommieB的答案给了你一个CodeProject文章下面的答案,因为这篇文章举例说明了监视状态变化的三种不同策略。 – BillW 2010-01-18 18:28:24