例如,我从RichTextBox或Panel派生一个类,重新构建项目以将该类添加到VS设计器工具箱中,然后将自定义用户控件拖放到窗体上。一切正常,可以运行项目...
问题出在通过设计器编辑窗体或自定义用户控件的属性时。有时,设计器会从其代码后台中删除初始化行,导致设计器和可执行文件发生异常,因为控件保持未初始化状态。
换句话说,下面这行代码,例如在Form1.Designer.cs中,被删除了:
this.customRichTextBox1=new CustomRichTextBox();
代码后台没有删除其他行,因此自定义控件的属性仍然被设置,尽管变量保持未初始化状态。
我的解决方案一直是在设计器代码后台手动初始化用户控件,但设计器最终会再次删除它。
我相信当我通过设计器构建自定义用户控件时不会发生这种情况(但我并不完全确定)。只有在手动定义类似以下内容时才会发生:
class CustomRichTextBox:RichTextBox{}
这真的很烦人。我错在哪里了?
按照 @Cody 的要求,以下是重现问题的步骤。我正在使用 VS2010,但我认为自2005年以来就一直遇到这个问题。
步骤 1. 创建新的 Windows Forms 应用程序,任何框架
步骤 2. 在您的主窗体类下方添加以下类:(这只是这次导致我出现问题的控件。)
class CustomRichTextBox : RichTextBox
{
Timer tt = new Timer();
internal CustomRichTextBox()
{
tt.Tick += new EventHandler(tt_Tick);
tt.Interval = 200;
}
protected override void OnTextChanged(EventArgs e)
{
tt.Stop();
tt.Start();
}
void tt_Tick(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("Hello world!");
}
}
第三步。按F6重新构建。
第四步。从工具箱中拖放CustomRichTextBox控件到您的表单中。
第五步。如果您希望,可以按F5测试应用程序,但它应该可以工作。关闭正在运行的应用程序。
第六步。按F6重新构建,此时设计器应崩溃,并显示以下消息:“变量'customRichTextBox1'未声明或未分配。”(在某些情况下,整个VS会完全崩溃,但错误通常仅限于设计器。)
第七步。为了纠正问题,请进入代码后台并初始化变量,但下次重新构建时,初始化行将消失。