繁体   English   中英

如何处理来自用户选项卡中的控件的事件,该用户控件是从选项卡页派生的,该选项卡在运行时动态添加到选项卡控件?

[英]How do I handle events from controls inside a User Control derived from a Tab Page meant to be added dynamically to a Tab Control at run time?

我创建了一个由标签页派生的用户控件,其中包含某些控件,如ListView,Button和Textboxes,以便在运行时动态地将标签页添加到标签控件中。

如何处理我的“ Tab控件”所在的主窗体中每个“用户页面”(这些用户控件选项卡的多个实例)中此类控件的事件? 最初,我希望能够将每个用户页面内某些控件中的数据传达回主窗体。

尽管我们使用以类似方式派生的标签页,但这不仅仅涉及标签页。 通过UI随意发送事件会引起很多混乱(保持各种事件触发的顺序等等)。 相反,我创建了一个控制器类,该类传递给各个UI组件,这些组件将更改通知给控制器,并且UI元素订阅控制器上的事件以接收有关环境的信息。

为了更具体,将每个派生的“选项卡页”都传递给控制器​​一个引用。 他们可以根据用户操作来更改控制器的状态。 假设当前记录已更改,则UI会在控制器上调用一个方法,将其告知新记录。

页面上的其他UI元素会收到此更改的通知,因为它们订阅了控制器的OnCurrentRecordChange事件。

虽然这将另一个类引入了组合,但优点是您只有一个控制器来协调对UI的更改,而不是一堆渗透和传递信息的事件。 我发现这也破坏了对UI元素协作的依赖:我可以添加,删除或更改UI元素,只要它们都与控制器对话以进行更新,那么代码返工就少得多。

如果您发现自己正在调试UI“循环”(一个控件中的更改正在触发其他控件中的更改,这些更改又触发了更多更改,这些更改最终影响了原始组件),那么控制器类的额外工作将立即得到回报。

更新:回答您的评论...第一站将是阅读Model View Controller体系结构: http : //en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller

举一个具体的例子: http : //www.dotnetheaven.com/Uploadfile/rmcochran/MVC_intro02012006001723AM/MVC_intro.aspx

使用Windows Forms时,许多人会陷入两层设计中:UI +数据层。 绑定系统非常自然,因为有一种获取数据的简便方法(实体框架,LINQ)和一种将数据连接至UI的简便方法(设计人员)。 在它们之间添加控制器并不像看起来那样困难。

在我的工作中,我将LLBLGen( http://www.llblgen.com/defaultgeneric.aspx )用于低层数据层,但是您可以用LINQ或Entity Framework或任何其他数据访问工具代替,并且总体概述是相同的。

在这一层之上,我构建了业务对象。 其中许多只不过是LLBLGen对象的外观(如果我的业务规则对实体没有太多说的话),而另一些则内置了很多验证,并且它们将几个低级对象聚合到更多可用的业务对象中。 最后,还有一些业务对象没有直接在其后面的实体(例如,系统之间的通信对象)。

我提到的控制器对象与我的业务对象并存,因为它知道这些对象,甚至将它们分发给UI以进行数据绑定。 当UI要进行更改时,它会通知控制器,并使用业务对象来确保允许更新,如果允许,则将更改向下传递到数据层。

在Wikipedia上的图中,“视图”是我的UI。 Controller是我的协调对象,它在两个方向上调解变化,而Model是我的业务对象层(该层在此之下具有较低的层次,但这是从较高层隐藏的实现细节)。

尽管从“视图<->模型”(经典数据绑定)过渡到“视图<->控制器<->模型”似乎增加了复杂性,但主要好处是控制器成为“真相”的一站式采购地点关于应用程序。 UI向控制器请求数据,因此控制器知道具有给定数据绑定的所有 UI元素。 如果情况发生变化,则事件会通知所有 UI元素,并且它们对于用户而言是可视的。 令人高兴的是,关于系统状态有一个“真相”,这就是控制器为UI管理的事实。

当数据需要保留时,请求将发送到控制器以更新模型。 同样,我们只有一个地方来协调保存和后续更新。 所有数据验证完整性规则都在业务逻辑层(模型)中,因此控制器的代码保持简洁。

通过分离您的UI关注点,协调关注点和业务逻辑关注点,您最终都将拥有非常“轻量”的方法和属性。 更重要的是,每个子系统都可以非常简单地查看应用程序,因为它们专注于那部分难题,而不是在一个完整的代码段中进行线程事件,UI更新和数据更新。

为了进一步阅读,我将推荐有关ASP.NET MVC的任何文章或书籍。 虽然这不是Winforms,但是MVC的基本思想可以应用于Winforms。 这里也有一些很好的评论: https : //stackoverflow.com/questions/2406/looking-for-a-mvc-sample-for-winforms

我应该清楚地知道,我在项目中所做的事情可能不被视为“纯” MVC,而只是将关注点与我们开发的应用程序中的自然故障线分开。 为此,我们不使用“框架”(尽管涉及一些代码生成)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM