C# 如何响应大型Form1.cs?

C# 如何响应大型Form1.cs?,c#,winforms,C#,Winforms,我一直在研究MVC和MVP,但我不确定它们是否是我想要的 我目前有很多模型对象,我的视图是主要形式(Form1.cs) 问题是现在的主要形式变得非常庞大。例如,当用户点击undo菜单项时,undoButton\u Click事件处理程序被调用。这很好。问题是,此事件处理程序中的代码是10行(弹出undoStack、推动redoStack、更新表单控件等等)。这听起来可能不多,但当表单上有许多控件时,这些行会很快加起来 我一直在考虑这个问题,我想要一个简单的解决方案。理想情况下,当调用undoBu

我一直在研究MVC和MVP,但我不确定它们是否是我想要的

我目前有很多模型对象,我的视图是主要形式(Form1.cs)

问题是现在的主要形式变得非常庞大。例如,当用户点击undo菜单项时,undoButton\u Click事件处理程序被调用。这很好。问题是,此事件处理程序中的代码是10行(弹出undoStack、推动redoStack、更新表单控件等等)。这听起来可能不多,但当表单上有许多控件时,这些行会很快加起来

我一直在考虑这个问题,我想要一个简单的解决方案。理想情况下,当调用undoButton_Click时,方法体将是一行代码。理想情况下,我可以调用一个类(可能是从定义单次运行方法或类似方法的接口派生的)来执行此撤消

问题是undoButton\u Click操作了许多表单控件和类的成员变量。这个类如何访问这些控件?我无法将表单作为参数传递,因为所有控件都是私有的。我真的不想让所有的控件都公开,或者提供大量的公共属性来访问它们。即使我这样做了,Form1有哪些成员变量像undoStack或document对象

传递所有需要的参数是完全不可行的,因为参数列表将是巨大的,如果需要进行更改,那将是一场噩梦

我真的不知道如何解决这个问题。不过,我知道的是,我的Form1.cs中的逻辑和对象操作太过混乱。我只希望它响应事件并调用相应的方法/类来处理事件


感谢您的阅读,很抱歉看到了这堵文字墙。

我不太明白您的代码应该做什么,但您应该将代码分成更多的小方法,这些方法有一个简短的代码,每个方法只执行很少的特定操作。当您达到该级别时,您将看到它们中的哪些可以用于几个控件,哪些仅用于一个控件。此外,您将看到它们每个都需要哪些参数,然后您将知道它们中的哪些可以位于单独的类中,哪些可以作为控件的私有方法,哪些将需要专用方法用于私有字段。
祝你好运和成功。

我也有类似的问题。我的解决方案是为我的MainForm创建分部类。我有一个用于事件处理程序,一个用于鼠标处理,一个用于键盘处理等等

我还将在许多地方使用的一些实用程序方法重构为一个单独的静态类

我还有另一个分部类,用于整个项目中使用的字段。最后,我对一些字段和属性使用一个静态类来减少向方法传递参数。我相信有些人会告诉我,这是一种不好的做法,但对我来说是有效的


最后,我使用Visual Studio的一个外接程序来计算代码的复杂性或可维护性,然后将那些大型或复杂的方法重构为较小的方法。

我将添加
ControlUndo
类和构造函数

ControlUndo(表单父表单、字符串控制名称、字符串属性)

表单上的每个
控件通过将其父表单、名称和属性名称传递给ctor来声明其可撤消属性

ControlUndo有一个方法
Undo()
,它从父窗体的
Controls
集合中查找
Control
对象,使用反射查找要撤消的属性并还原值

在新的
ControlUndo
添加到可撤消对象的全局集合之后。在调用窗体上的
Undo
时,只需为集合调用中的每个元素调用
Undo()

用户界面呢

如果表单上有很多控件,
user
几乎不可能同时需要所有控件。因此,您可以根据您的应用程序逻辑,在不同的
TabPages
中划分它们,方法是在表单上设置所有控件,但将
UI
内容限制在用户需要的最重要的内容上


希望这有帮助。

您应该尝试从UI层中删除尽可能多的逻辑。当您需要执行业务逻辑时,该逻辑应该位于您的业务层中。UI应该只知道如何直观地表示各种数据,并向业务层发出命令。您不需要使用MVC来实现这一点

从概念上讲,考虑一个人的阶级。这将有一组属性(名称、地址、狗名)。您的UI将有一组文本框,以及对它所代表的person实例的引用。对文本框进行更改后,更改将应用于person实例。当您想要撤消时,可以对person对象调用undo,由该对象恢复到其以前的状态(并允许重新执行)。撤销完成后,UI会将新值放入文本框中,但它不应该关心实际撤销或重新执行的方式

这可以手动实现,也可以使用.NET中的内置数据绑定机制实现。我的主要观点是,;尽可能将逻辑与UI分离,表单只会在屏幕上显示内容,并发出命令。每当SQL语句或计算开始出现在按钮的单击处理程序中时,您就走错了方向


在具体的撤销示例中,您应该看看memento设计模式(并且)

您是否可以将表单拆分为更小的控件或部分视图?这就是我要说的,但简单明了。太好了!:-)