我需要在ToolStrip中有一个MaskedTextBox,默认情况下不包含MaskedTextBox,所以我遵循了一些在线发现的建议,并创建了继承自ToolStripControlHost的自定义控件.当我运行应用程序时,我创建的工作非常好,但这真的搞砸了设计师.通过“混乱”,我的意思是自定义控件(和其他一些)从ToolStrip消失.此外,我不能再向ToolStrip添加新的控件,并且我无法选择ToolStrip上的现有控件进行编辑.
这是我的课.
[DesignerCategory("code")]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public partial class ToolStripMaskedTextBox : ToolStripControlHost
{
public MaskedTextBox MaskedTextBox
{
get { return Control as MaskedTextBox; }
}
public ToolStripMaskedTextBox()
: base(CreateControlInstance()) { }
private static Control CreateControlInstance()
{
MaskedTextBox mtb = new MaskedTextBox();
mtb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
mtb.MinimumSize = new System.Drawing.Size(100, 16);
mtb.PasswordChar = '*';
return mtb;
}
}
任何帮助我可能做错了,给设计师一个困难的时刻将不胜感激.
添加信息
现在当我在Visual Studio中打开我的类文件时,我收到一个带有以下错误的警告页:
Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found.
添加信息2
问题只在构建解决方案后才会出现.我可以通过修改Form.Designer.cs文件甚至最小的方式使设计人员正常工作.喜欢添加一个空格.从那里开始,设计师将工作正常.直到我构建解决方案.然后设计师再次冻结.表单上的任何控件都不能被编辑.
根据例外情况
Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found.
我在MSDN论坛上找到了一些信息.
这发生了,因为ToolStripControlHost类没有没有参数的构造函数.
要解决这个问题,您可以使用无参数构造函数创建自己的ToolStripControlHost,并使ToolStripMaskedTextBox从ToolStripControlHost继承.尝试以下的东西
//Declare a class that inherits from ToolStripControlHost.
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public class ToolStripMaskedTextBox : MyCustomToolStripControlHost
{
// Call the base constructor passing in a MaskedTextBox instance.
public ToolStripMaskedTextBox() : base(CreateControlInstance()) { }
public MaskedTextBox MaskedTextBox
{
get
{
return Control as MaskedTextBox;
}
}
private static Control CreateControlInstance()
{
MaskedTextBox mtb = new MaskedTextBox();
mtb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
mtb.MinimumSize = new System.Drawing.Size(100, 16);
mtb.PasswordChar = '*';
return mtb;
}
}
public class MyCustomToolStripControlHost : ToolStripControlHost
{
public MyCustomToolStripControlHost()
: base(new Control())
{
}
public MyCustomToolStripControlHost(Control c)
: base(c)
{
}
}
这将解决您的异常问题.
表单设计器(运行应用程序后ToolStripMaskedTextBox不可见)的问题未解决,但您可以关闭设计器并再次打开该文件.
那么你可以没有任何问题.
希望这可以帮助
相关文章
翻译自:https://stackoverflow.com/questions/8856394/net-custom-control-toolstripcontrolhost-wreaks-havoc-on-the-designer