.NET自定义控件(ToolStripControlHost)在Designer上造成严重破坏

我需要在ToolStrip中有一个MaskedTextBox,默认情况下不包含它,所以我按照我在网上找到的一些建议,创建了inheritance自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,并使ToolStripMaskedTextBoxinheritance自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) { } } 

这将解决您的exception问题。

表单设计器的问题(运行应用程序后看不到ToolStripMaskedTextBox)没有解决,但您可以关闭设计器并再次打开文件。

然后你可以继续没有任何问题。

希望这可以帮助

我使用了dknaack的解决方案 ,但将MyCustomToolStripControlHost类放在System.Windows.Forms命名空间中的单独文件中。 和…

第一:它有效 – 没有例外。 然后:我的控制在设计师中也是可见的,所以这是一个累积奖金。

在这个链接中 ,答案是实现“blah”接口的对象必须具有无参数构造函数。 试试看。

FWIW:我也成功使用了上面的dknaack解决方案,但只是在我意识到我在错误的地方寻找自定义ToolStrip控件之后。 自定义控件不会显示在工具箱本身中。 相反,它显示在ToolStrip选中(在设计器中)时出现的“Add ToolStripButton”下的组件下拉列表中。