Winform自定义控件 - Designer随机停止初始化/调用构造函数

时间:2012-04-29 06:32:23

标签: c# winforms visual-studio visual-studio-2010 custom-controls

这是一个令人毛骨悚然的噩梦,我迫切需要帮助。我在任何地方都寻求帮助,并没有永久性地解决这个问题。

我已经开发了一些自定义控件;控制扩展按钮,用户控制等。我有一个问题,VS2010不断和随机,没有押韵或我无法辨别的理由,决定我何时尝试打开使用自定义控件的控件的设计视图< strong>(编辑:'它'是Windows窗体生成器)应该完全删除从.designer.cs文件调用自定义控件的构造函数的LINE,从而完全破坏我查看设计视图的能力。该应用程序仍然构建并运行完全正常。

我已经测试并排除了以下问题:

  1. 公共构造函数 - 显然拥有非公共(内部等)构造函数可能会导致类似这样的问题。我已经检查了100次 - 所有自定义控件都有公共构造函数。

  2. 空构造函数 - 除了公开之外,还需要为空。

  3. 没有调用构造函数中可能失败的任何内容 - 我已将自定义控件的所有构造函数减少为空

     Name() { }
    调用。那里没有运气。

  4. 命名空间 - 显然位于不同的命名空间中会导致问题?我在同一个,文件是在同一个项目。

  5. 卸载项目。关闭VS.删除.suo intellisense文件。删除obj文件。打开VS.重新加载项目。重建项目。仍然没有运气。

  6. 这令人沮丧。我已经准备好使用自定义控件和SKIN EVERY CONTROL控制,以避免它。是否有人知道是什么导致这种情况?

1 个答案:

答案 0 :(得分:3)

首先,问题是......你把东西放在“.designer.cs”代码中......不要。这是微软的沙箱。当创建WinForms表单和可视控件时,它们通常位于“set”中,例如

MyForm.cs   (place for YOUR code)
   MyForm.designer.cs  (Microsoft's sandbox area for designer stuff)
   MyForm.resx   (Resource file -- if used, specific to this form).

也就是说,如果您通过普通的“Designer”打开WinForm,并右键单击“查看代码”,它将调出MyForm.cs代码集。注意它的一个

PARTIAL PUBLIC CLASS MyForm : Window
{
   public MyForm()
   {
      InitializeComponent();
   }
}

“MyForm.Designer.cs”和“MyForm.cs”基本上是一个团队。你的东西除了微软的东西。根据您要执行的操作,您可以在此构造函数中将其挂钩到整个表单中。如果您需要准备一些数据连接,查询数据,填充列表或将在表单中使用的任何内容。你可以通过多种方式(在之前或之后)做。

   public MyForm()
   {
      DoYourStuff();
      InitializeComponent();
      // or DoYourStuff here after designer controls are all initialized.
   }

   private void DoYourStuff()
   {  put it here }

有时您可能希望在加载整个表单之后,但在最终呈现给用户之前执行操作。有时,我实际上在LOADED完成整个表单(表单和所有它的控件)之后放了一个钩子。所以我做了类似的事情:

public MyForm()
{

   Load += MyAfterInitializeComponents;
   InitializeComponent();
}


private void MyAfterInitializeComponents(object sender, EventArgs e)
{  
   DoYourStuff(); 
}

如果您正在尝试执行某些特定操作,可能需要一些示例代码来帮助您在基于窗口的代码的沙箱中进行集成。