Winforms 管理表单状态的更好方法?

Winforms 管理表单状态的更好方法?,winforms,Winforms,我不熟悉Windows编程,因为在我以前的工作中,我主要涉及web技术,而且主要是在后端。我继承了一个Winforms应用程序,我最大的噩梦之一就是在表单可能处于的无尽状态中导航 举个例子,表单的状态为“新建”和“编辑”,具体取决于用户是否决定添加或编辑记录。在这个形式上,我们有逻辑。如果此文本框具有特定值,则这些其他文本框将被禁用,等等。这将导致这些规则的无休止链接。因此,textbox的TextChanged事件将影响另一个字段。它将依次触发X事件,该事件将更改其他控件的状态。它很快就演变成

我不熟悉Windows编程,因为在我以前的工作中,我主要涉及web技术,而且主要是在后端。我继承了一个Winforms应用程序,我最大的噩梦之一就是在表单可能处于的无尽状态中导航

举个例子,表单的状态为“新建”和“编辑”,具体取决于用户是否决定添加或编辑记录。在这个形式上,我们有逻辑。如果此文本框具有特定值,则这些其他文本框将被禁用,等等。这将导致这些规则的无休止链接。因此,textbox的TextChanged事件将影响另一个字段。它将依次触发X事件,该事件将更改其他控件的状态。它很快就演变成一团无法维持的混乱


一定有更好的方法。。。解决这个问题的简单而优雅的东西。有什么建议吗?

您可以尝试使用应用程序.Idle事件来执行启用-禁用逻辑,并将此部分与业务逻辑部分隔离。

取决于表单上的控件,您可能可以取消单独的文本框和添加/删除按钮,并使用
DataGrid

替换整个工作。我要做的是使用一个名为
FormatControls()
的方法。在这个方法中,我实现了所有逻辑,比如
myTextbox.Enabled=mycheckBox.Checked
等等

我从窗体中的事件处理程序调用此方法,例如on checked change等。。。我也在适当的时候调用它(即,新加载的表单没有数据,从数据库加载的记录,等等)。多年来,这一直很适合我,它让一切变得不那么复杂


您是对的,如果您没有使用模式,它可能会变得太复杂。

这可能被认为是更“松散耦合”,但有可能将CPU固定在100%。@Reinderien如果您不在空闲处理程序中执行代价高昂的循环,您的CPU将无法填充任何代价高昂的负载,只是因为此事件是由windows的旧消息循环引发的。我不确定我是否理解这一点。每次整个应用程序处于空闲状态时,Application.Idle事件不会触发吗?如果申请表中有很多表格怎么办?我是否需要找出当前显示的是哪些窗口,然后执行必要的逻辑?尝试它需要花费一秒钟的时间,在处理所有消息时,windows消息泵会触发on idle,通常是我们更新UI状态的地方。我喜欢这个想法,。但我发现FormatControl本身变得相当大(当然,您可以将其重构为更小的部分)。我想逻辑必须要走到某个地方,最好放在一个中心位置,而不是分散在多个事件处理程序中。我必须根据其他单元格的值禁用某些列。这变得更加复杂,因为我需要逐行管理它。