首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET自定义控件(ToolStripControlHost)对设计人员的破坏

.NET自定义控件(ToolStripControlHost)对设计人员的破坏
EN

Stack Overflow用户
提问于 2012-01-13 19:50:49
回答 5查看 6.4K关注 0票数 14

我需要在一个默认情况下不包括的MaskedTextBox中有一个ToolStrip,所以我遵循了我在网上找到的一些建议,并创建了从ToolStripControlHost继承的自定义控件。当我运行应用程序时,我所创建的内容非常有用,但它确实使设计人员感到困惑。所谓“混乱”,我指的是自定义控件(以及其他一些控件)从ToolStrip中消失。另外,我不能再向ToolStrip中添加新的控件,也不能选择ToolStrip上的现有控件来编辑它们。

这是我的课。

代码语言:javascript
复制
[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中打开类文件时,会得到一个警告页面,其中包含以下错误:

代码语言:javascript
复制
Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found. 

加法信息2

问题只有在构建解决方案之后才会发生。我可以通过以最小的方式修改Form.Designer.cs文件来使设计器正确工作。比如加一个空格。从那以后,设计师就会工作得很好。直到我想出解决方案。然后设计师又结冰了。窗体上的任何控件都不能编辑。

EN

回答 5

Stack Overflow用户

发布于 2012-01-17 17:51:43

根据例外情况

代码语言:javascript
复制
Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found. 

我在MSDN论坛上找到了一些信息。

之所以会发生这种情况,是因为ToolStripControlHost类没有没有参数的构造函数。

要解决这个问题,可以使用无参数构造函数创建自己的ToolStripControlHost,并使ToolStripMaskedTextBox继承自ToolStripControlHost。尝试以下几种方法

代码语言:javascript
复制
//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)没有得到解决,但是您可以关闭设计器并再次打开文件。

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

希望这能帮助

票数 11
EN

Stack Overflow用户

发布于 2013-12-02 17:53:44

我使用过dknaack's solution,但将MyCustomToolStripControlHost类放置在System.Windows.Forms命名空间中的一个单独文件中。还有..。

第一:它有效--也不例外。然后:我的控制在设计师中也是可见的,所以这是头奖。

票数 1
EN

Stack Overflow用户

发布于 2012-01-23 20:01:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8856394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档