“视觉传承”的状态是什么

时间:2008-09-08 10:58:07

标签: visual-studio winforms forms visual-inheritance

我们有一个应用程序,必须灵活地向用户显示它的主要形式 - 取决于用户,表单应该略有不同,可能是这里或那里的额外按钮,或其他一些细微差别。为了停止编写代码以显式删除或添加控件等,我转向视觉继承来解决问题 - 我认为这是一个整洁,干净和逻辑的OO风格 - 事实证明,继承表单的一半时间很难在VS中渲染自己没有充分的理由等等 - 我觉得开发人员和某种程度上微软已经避开了Visual Inheritance的做法 - 你能否证实这一点,我在这里错过了什么?

问候。

6 个答案:

答案 0 :(得分:6)

我认为他们在2005年或多或少地对桌面设计师问题进行了排序。 你有没有尝试过常见的罪魁祸首?

  • 没有抽象控制类型
  • 没有任何形式的构造函数参数
  • 初始化移至Form_Load而非Ctor
  • 在与
  • 中放置的usercontrol /表单相同的项目中没有控件
  • 关闭所有文件 - >清洁 - >重建
  • 重启VS

我似乎认为,只要你完成上述所有工作,它就会起作用.....。

答案 1 :(得分:3)

我正在研究(不可否认的是即将淘汰的)MCAD,而WinForms元素的一部分是Visual Inheritence。

我个人没有遇到任何重大问题,但需要考虑

对我而言,主要问题始终是初始化 ..您需要记住,设计人员不能/不会以与运行时相同的方式实例化表单(类似地,它不能这样做使用web dev,这就是自定义控件渲染需要关注的原因。)

此外,一旦表单发生更改,就需要完全重新构建项目,以便将对表单的更改传播到从其继承的子表单。

我个人没有看到任何证据表明它已被“避开”。 AFAIK,在可能的情况下重复使用代码仍然是一种很好的做法。视觉继承提供了。

我可以建议您使用实际的问题创建一个新问题,并提供示例代码吗?然后我们可以看一下它,看看我们是否可以使它工作并解释原因:)

答案 2 :(得分:2)

我已经在VS2005中看到了一些问题。它们主要是由于在设计师中构造表格对象的问题。尝试从表单构造函数等访问数据库的代码存在问题。

您可以通过启动Visual Studio的第二个实例并在调试器中加载第一个实例来调试此类问题。如果在代码中设置断点,则可以调试第一个实例中设计器中发生的事情。

我记得的另一个问题是表单类中的泛型

public class MyForm<MyObject> : Form

这不起作用

答案 3 :(得分:1)

我经常在Visual Studio中偶然发现这些问题。在许多情况下,MSVS表单设计器无法正确呈现表单。回到我使用WinForms的日子里,我不得不做各种奇怪的技巧来实现一些复杂的场景。但是我认为使用可视继承是非常有益的,不管MSVS设计器错误如何都不应该丢弃。

答案 4 :(得分:1)

我想我找到了一种避免这个问题的方法。

不要在父表单中挂钩Form_Load事件,这会破坏设计器。

也不要在父窗体中将默认空构造函数从Visual Studio中取出。如果您想要依赖注入,请创建另一个构造函数。

像这样:

public ProductDetail()
{
    InitializeComponent();
}

public ProductDetail(ISupplierController supplierController) : base()
{
    InitializeComponent();
    this.supplierController = supplierController;
}

然后,您仍然可以从继承的表单执行此操作:

public NewProduct(ISupplierController supplierController)
    : base(supplierController)
{
    InitializeComponent();
}

到目前为止,这对我有用,我也有一些奇怪的设计师问题。

欢呼,丹尼尔

答案 5 :(得分:0)

阅读本文:http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx

AFAIK,仍然存在Visual Inheritance和依赖于设计元素集合的对象的问题,通常是网格控件等。我相信MS仍然没有改变f.ex的可能性。继承的表单/ usercontrol等中的GridView。但TextBox,Form,UserControl,Panel等其他控件应该按预期工作。

到目前为止,我自己使用第三方网格控件没有问题,但是你必须要小心,特别是必须避免从集合中删除项目。