【问题标题】:Custom Control Overridden Text Property Default Value自定义控件覆盖的文本属性默认值
【发布时间】:2011-01-21 19:47:16
【问题描述】:

我创建了一个用户控件,其中包含一个文本框。我已经覆盖了基本控件的 Text 属性,如下所示:

    [Browsable(true)]
    [DefaultValue("")]
    [Description("Test1"), Category("Test")]
    public new string Text
    {
        get
        {
            return textBox1.Text;
        }
        set
        {
            textBox1.Text= value;
        }
    }

现在,我遇到了这个问题,我在表单中创建的控件的任何实例,文本始终具有控件名称 + 编号(实例)的值。我想知道为什么会这样,以及如何删除这个默认值?谢谢。

【问题讨论】:

    标签: c# properties custom-controls


    【解决方案1】:

    最初的预感是它正在对象上调用ToString()。覆盖 ToString() 以返回您想要的值。

    【讨论】:

    • 我完全忘记了 ToString()。这可能就是我获得价值的原因。谢谢,亚伦。但是,覆盖它没有任何效果。我忘记提到的一件事是 [Browsable(true)] 是导致该行为的属性。通过删除它,一切都按预期工作。
    【解决方案2】:

    属性DefaultValue 没有设置默认值。该属性用于描述默认值是什么。你得自己设置默认值,然后用属性来描述。

    因此,在您的示例中,必须使用控件 ID 填充 textbox1.Text。在您的用户控件上,OnInit 或任何适当的地方,您应该调用

    this.Text = "";
    

    【讨论】:

    • 我已经尝试在许多事件中设置文本但没有成功,s_hewitt。我可以做一个 hack 来删除这个值,但它很难看。
    • 那时您可能需要发布更多代码。我不清楚您的控件是如何设置的以及是如何导致问题的。
    • 问题主要出在 [Browsable(true)] 中,正如我在另一条评论中提到的那样。创建一个带有文本框的控件并尝试上面的代码,您会明白我的意思。非常感谢您的宝贵时间。
    • 我无法重现任何问题。如果您可以仅使用 Usercontrol 将其隔离在新项目中,请发布该代码。
    【解决方案3】:
    [DefaultValue("")]
    public override string Text
    {
        get { return base.Text; }
        set
        {
            if (this.DesignMode && (Environment.StackTrace.Contains("System.Windows.Forms.Design.ControlDesigner.InitializeNewComponent")))
                return;
            base.Text = value; 
            Invalidate();
        }
    }
    

    【讨论】:

    • 欢迎使用 StackOverflow,虽然代码可能有效,但请不要忘记添加说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多