如何使用嵌套命名空间进行自定义控件?

时间:2012-10-12 09:57:11

标签: c# winforms user-controls namespaces windows-forms-designer

我在命名空间下定义了一个用户控件ExpressionControl:

TriggerEditor.UserControls

我在命名空间下有一个表单“IfEditor”:

TriggerEditor.Forms

当我将一个控件实例添加到表单(命名为expCondition)时,在Designer中生成以下代码来创建控件:

this.expCondition = new TriggerEditor.UserControls.ExpressionControl();

这会导致以下编译错误:

The type name 'UserControls' does not exist in the type 'TriggerEditor.Forms.TriggerEditor'

我不明白为什么要查看“TriggerEditor.Forms.TriggerEditor”;这不是代码所说的。现在,我可以通过修改行手动解决此错误,删除“TriggerEditor”。在“TriggerControls”之前,如此:

this.expCondition = new UserControls.ExpressionControl();

这满足了编译器,但是每次我将ExpressionControl的实例添加到表单时,我显然不希望这样做。我该如何避免这种情况?

2 个答案:

答案 0 :(得分:2)

看起来你可能在TriggerEditor命名空间中有一个TriggerEditor.Forms类;是这样的吗?

如果是这样,因为TriggerEditor类在你当前的命名空间内,你“更接近”这个类,因此它正在寻找一个子类。

答案 1 :(得分:1)

避免对类和命名空间使用相同的名称!?

显然,在命名空间TriggerEditor.Forms中,您在与IfEditor类相同的命名空间中有一个名为TriggerEditor的类。

因此,在查找TriggerEditor.UserControls.ExpressionControl时,编译器会查找TriggerEditor类(位于相同名称空间中,因此更接近)而不是TriggerEditor名称空间...

通常,为了避免这种情况,你会使用namespace alias qualifier,但是在Designer生成的类中,你无法真正控制它。