.NET自定义控件(ToolStripControlHost)在Designer上破坏了Havoc

时间:2012-01-13 19:50:49

标签: c# .net winforms

我需要在ToolStrip中有一个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文件来使设计人员正常工作。就像添加一个空格一样。从那以后,设计师将工作得很好。直到我构建解决方案。然后设计师再次冻结。表格中没有任何控件可以编辑。

5 个答案:

答案 0 :(得分:11)

根据例外情况

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)未解决,但您可以关闭设计器并再次打开文件。

然后你可以毫无问题地继续下去。

希望这会有所帮助

答案 1 :(得分:1)

我使用了dknaack's solution,但将MyCustomToolStripControlHost类放在System.Windows.Forms命名空间中的单独文件中。和...

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

答案 2 :(得分:0)

this link中,答案是实现“blah”接口的对象必须具有无参数构造函数。试一试。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我找到了设计师问题的解决方案。 https://dobon.net/vb/dotnet/control/tschdesigneravail.html#tips_comment(日语)

您所需要做的只是制作一个从ToolStrip派生的类并替换它。

class DesignerFriendlyToolStrip : ToolStrip { }

var ts = new DesignerFriendlyToolStrip();
ts.Items.Add(toolStripMaskedTextBox);
form.Controls.Add(ts);

我不知道为什么这样有效。有人知道...吗?