提问者:小点点

在Visual Studio中设计通用表单


我有大约6个类,它们都继承自同一个基类。我正在制作一个用户界面,允许用户编辑这些类,然后将它们持久化到数据库中。如果我只能使用泛型,我可以让所有的代码都工作得很好。

一旦我尝试使表单通用化,就会出现一些严重的问题。我读过一些解决方案,比如:http://social.msdn.microsoft.com/Forums/windows/en-US/afdfce40-8d7a-4300-bd8d-26e18c320a71/designer-error-with-descendant-of-generic-form?forum=winformsdesigner但它们似乎真的不起作用。所有这些都是为了给我一个设计好的表单,但不能用于泛型,还有一个空表单类,它继承了泛型。

我需要一个表单,我可以在设计器中编辑,并在我的程序中使用泛型类型构造,它维护设计器中的表单中的所有设计和代码。

有人对此有可行的解决方案吗?


共1个答案

匿名用户

事实证明,我链接的文章中显示的解决方案是正确的,但它只是让人困惑。

我想我会发布我的答案来帮助其他可能有这个问题的人。

场景:您有一个表单,需要能够与泛型一起使用(即,传入一个类型以用于某些特殊的事情)。这样做的主要好处是使用设计器生成表单的所有代码。

我的场景是一个基本的GUI来编辑一些从同一个父级继承的对象。表单由添加、删除和保存按钮以及对象绑定到的DGV组成。您可以使用泛型,而不是重复表格N次并强键入它。

解决方案设计您在设计器中的第一个表单。你可以把任何非通用代码放在这里。但对我来说,我有一个文件,它完全是设计器代码:

非通用查找表。vb

Public Class NonGenericLookupForm   

End Class

此窗体的设计器代码文件将包含您的所有控件。

然后创建从该表单继承的另一个文件:

通用查找表。vb

Public Class GenericLookupForm(Of T As {LookupItem, New})
    Inherits NonGenericLookupForm

    Private lookupItems as List(of T)

    ' Other code here. You can handle events from the inherited form

End Class

最后,您可以使用您的类型创建此表单:

Dim SpecificLookupEditor as New GenericLookupForm(of SpecificLookupType)
SpecificLookupEditor.ShowDialog()