5

这是一场可怕的噩梦,我迫切需要帮助。我到处寻找帮助没有什么可以作为永久修复。

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

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

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

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

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

     Name() { }
    来电。那里没有运气。

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

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

这非常令人沮丧。到了这一点,我已经准备好放弃使用自定义控件并手动对每个控件进行蒙皮以避免它。有没有人知道是什么原因造成的?

4

1 回答 1

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).

也就是说,如果您通过普通的“设计器”打开您的 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(); 
}

如果您正在尝试做一些特定的事情,也许有一些示例代码可以帮助您集成到您的基于窗口的代码沙箱中。

于 2012-04-30T11:12:54.390 回答