如何在Windows窗体应用程序中使用派生控件

时间:2010-11-22 14:47:07

标签: winforms user-interface

充其量,我是一个UI新手,但我是一个非常好的OO开发人员(如果我自己不这么说的话)。我很困惑如何与设计师合作。我正在开发一个Windows窗体应用程序。我有一个控件(TabPage),我从System.Windows.Forms.TabPage派生出来,我想放在System.Windows.Forms.TabControl控件上。

public class MyTabPage : TabPage
{ ... }

我不确定如何让设计师使用我的控件。

一位开发人员为我看了这个,因为建议我添加更多信息。

我已经为WinForms应用程序做了原型。该应用程序有一个TabControl,上面有三个标签页。每个TabPage在分割器的每一半中都有SplitterControlDataGridView控件。这两个DataGridView控件构成了我们需要编辑的一些数据的主 - 详细视图。我已经为每个DataGridView控件添加了一堆事件处理程序,每次处理程序代码都放在表单中。表格变得非常拥挤,并希望使用OO技术来清理。

我想现在重做原型,因为每个TabPage在行为上是相同的,我想用OO来抽象出一些复杂性。这就是我缺乏设计师经验的地方。必须有一种方法可以让设计师使用比我的原型更复杂的东西。

4 个答案:

答案 0 :(得分:2)

不幸的是,你的问题没有真正实用的解决方案。您还必须创建一个自定义TabControl并为其提供自己的设计器,以便它将创建派生类的实例而不是默认的TabPage类。

可悲的是,System.Design.dll中的TabControlDesigner类是内部的,无法派生自。你必须写一个完整的替代品。这很难,它是一位非常先进的设计师。你可以看一下Reflector,看看它需要什么。

答案 1 :(得分:2)

你并没有真正改变TabPage的行为,它毕竟只是一个容器:)。 TabPage和TabControl是紧密耦合的,它们可能应该是。您的“控件”应该放在TabPage上。因此,将用户控件定义为具有拆分器和两个datagridviews的面板,然后将用户控件放在应用程序中的每个TabPage上。选项卡控件/页面串联仍将自动运行,您的自定义代码将处于适当的控件中。

答案 2 :(得分:1)

<强>用户控件

只需创建包含控件的用户控件即可。然后它将在Visual Studio的ToolBox窗口中可用。

有关详细信息,请Understanding the User Control Designer ...

  

用户控件与其他任何控件类似   上课,但增加了能力   放在工具箱中并显示   在表格上。

本教程与Visual Studio 2010略有不同,但我相信您会完成它。


TabPage控件

对于TabPage控件,您不能在设计器中单独使用它。它必须是TabControl的一部分。

TabControl构建为包含TabPage控件。如果你使用设计器添加/删除任何TabPage,在后端它会执行“new TabPage”,它无法确定它需要创建派生类TabPage的新实例。


其他建议

TabPage只是一个容器,我无法弄清楚为什么需要覆盖TabPage控件。我知道您已经在问题中添加了一些信息,但您可能需要重新访问它,以便我们更好地理解。

由于TabPage是一个容器,您应该创建一个包含SplitContainer和DataGridViews的UserControl。因此,您可以在每个TabPage上重用该UserControl。

设计师只是UI编程的补充,它不是强制性的。您可以在不使用设计器的情况下将UserControl添加到TabPage。

我可能会离开这里,如果是这样,请提供更多详情。您需要的视觉原型可能有所帮助。

答案 3 :(得分:0)

已经有一段时间了,但我想我会回答这个问题。

我能够通过拆分控件获得我想要的OO实现。该控件的实现与原型几乎相同。然后,我创建了一个带有派生类的控件绑定器类hirearchy,以包含我需要的特定行为。该控件具有对binder基类的引用,并根据需要调用binder功能。派生的绑定器会根据需要覆盖属性和方法。几乎是教科书OO解决方案。

在我磕磕绊绊的地方,我认为我需要控制一个控制权。

感谢大家的帮助。当我问这个问题时,我受到了一些压力。从那以后的几个月里我学到了多少,这真是令人惊讶。