2011-09-04 73 views
0

我一直在研究MVC和MVP,但我不确定它们是我想要的。如何响应一个大的Form1.cs?

我现在有很多模型对象和我的看法是主要形式(Form1.cs的)

的问题是主要的形式变得非常大了。例如,当用户点击撤消菜单项时,调用undoButton_Click事件处理程序。这可以。问题是这个事件处理程序中的代码是10行(弹出undoStack,推动redoStack,更新表单控件等等)。这听起来可能不是很多,但是当表单上有很多控件时,这些线条很快会加起来。

我一直在想它,我想要一个简单的解决方案。理想情况下,当调用undoButton_Click时,方法体将是一行代码。理想情况下,会有一个类(可能来自定义单个Run方法的接口或类似的东西),我可以调用它来执行此撤消操作。

的问题是,undoButton_Click许多表单控件和所述类的成员变量进行操作。这个班级如何获得这些控制?我无法将表单作为参数传递,因为所有控件都是私有的。我真的不想让所有的控制公开或提供大量的公共财产来访问它们。即使我做了Form1的那些成员变量如何使用undoStack或文档对象?

这是完全不可行的通过所有需要的参数,因为paramater名单将是巨大的,如果变化将永远需要进行这将是一场噩梦。

不太确定如何解决这个问题。但我所知道的是,我的Form1.cs对于对象的逻辑和操作太混乱了。我只想让它响应事件并调用相应的方法/类来处理事件。

感谢您的阅读和对文本墙的抱歉。

+0

你能不只是突破的形式进入小控件或部分观点? – TheCodeKing

回答

0

我不太明白你的代码是该做的,但你应该单独代码,其有一个简短的代码,做一些各自的具体行动更小的方法。当你达到这个水平时,你会看到哪些可以用于控制几个控件,哪些仅适用于一个控件。此外,你会看到他们每个人都需要什么参数,然后你会得到一个线索,他们中的哪一个可以在一个单独的类中,并且可以作为一个控制的私有方法,并且需要一个私有的专用方法领域。 祝你好运,成功。

1

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

我也重构了一些,它们会在许多地方使用到一个单独的静态类的实用方法。

我也有用于跨项目使用的字段另一部分类。最后,我对某些字段和属性使用静态类来减少传递参数到方法。我相信有些人会告诉我这是不好的做法,但它适用于我。

最后,我用一个插件到Visual Studio计算的代码的复杂性和可维护性,然后重构那些大型或复杂的成更小的方法。

+0

这就是我正在谈论的,但总之和清晰的短语。对你有好处! :-) – Seffix

0

我想补充ControlUndo类构造函数

ControlUndo(Form parentform, string controlname, string property)

表单上的每个control都通过传递其父窗体,其名称和属性名称来声明其可撤销属性。

ControlUndo有一个方法Undo()Controls收集母体形式的发现一个Control对象,使用反射找到一个属性来撤消和恢复的值。

新的ControlUndo被添加到可撤销对象的全局集合。当您调用表单上的Undo时,您只需为集合中的每个元素调用Undo()

UI呢?

如果您在窗体上有很多控件,那么user几乎不可能在同一时间全部使用它们。因此,根据您的应用逻辑,您可以将它们放在不同的TabPages之间,方法是将所有控件放置在表单上,​​但限制UI用户在该时刻需要的最重要内容。

希望这会有所帮助。

0

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

从概念上讲,考虑一个Person类。这将有一组属性(名称,地址,狗的名字)。您的用户界面将拥有一组文本框,以及对其代表的个人实例的引用。当对文本框进行更改时,更改将应用​​于人员实例。当你想撤消时,你可以调用undo对象来完成,并且该对象将恢复到之前的状态(并允许重新执行)。撤消完成后,用户界面会将新值放入文本框中,但不应该在意如何执行实际撤销或重做。

这可以通过手动实现,或者使用.NET中的内置数据绑定机制来实现。我的主要观点是,尽可能将你的逻辑从你的UI中分离出来,而Form只会在屏幕上显示内容并发出命令。无论何时SQL语句或计算开始出现在按钮的点击处理程序中,您都处于错误的轨道上。

在撤销的具体的例子,你应该看看纪念品设计模式(herehere

相关问题