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

try*_*tch 5 c# custom-controls visual-studio-2010 visual-studio winforms

这是一场可怕的噩梦,我迫切需要帮助。我到处寻求帮助,但没有任何办法可以永久解决。

我开发了一些自定义控件;扩展按钮、用户控件等的控件。我有一个问题,VS2010 不断地、随机地、没有我能辨别的韵律或原因,决定何时尝试打开一个使用它的自定义控件的控件的设计视图(编辑:“it”是 Windows 窗体生成器)应该完全删除从 .designer.cs 文件中调用自定义控件的构造函数的行,从而完全破坏了我查看设计视图的能力。该应用程序仍然可以完全正常构建和运行。

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

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

  2. 空构造函数 - 除了是公共的之外,它还需要是空的。

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

     Name() { }
    Run Code Online (Sandbox Code Playgroud) 来电。那里没有运气。

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

  5. 卸载项目。关闭VS。删除 .suo 智能感知文件。删除 obj 文件。打开VS。重新加载项目。重建项目。还是没有运气。

这太令人沮丧了。我已经准备好放弃使用自定义控件并手动为每个控件单独设置皮肤以避免它。有谁知道造成这种情况的原因吗?

DRa*_*app 3

首先,问题是...您正在将内容放入“.designer.cs”代码中...不要这样做。这就是微软的沙箱。当创建 WinForms 表单和可视控件时,它们通常位于一个“集合”中,例如

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).
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您通过普通的“设计器”打开 WinForm,然后右键单击“查看代码”,它将显示 MyForm.cs 代码集。注意它的一个

PARTIAL PUBLIC CLASS MyForm : Window
{
   public MyForm()
   {
      InitializeComponent();
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

   private void DoYourStuff()
   {  put it here }
Run Code Online (Sandbox Code Playgroud)

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

public MyForm()
{

   Load += MyAfterInitializeComponents;
   InitializeComponent();
}


private void MyAfterInitializeComponents(object sender, EventArgs e)
{  
   DoYourStuff(); 
}
Run Code Online (Sandbox Code Playgroud)

如果您想要做一些特定的事情,也许可以使用一些示例代码来帮助集成到您的基于窗口的代码沙箱中。