1

我试图创建一个新的控件,TextBoxRialiTextBox是一种货币文本框。

问题是,当我覆盖该Text属性,然后构建控件时,在窗体上拖动新创建的 TextBox 时,Visual Studio 崩溃。

我什至尝试了new关键字,但又一次出现“堆栈溢出错误”。我究竟做错了什么?

这是我正在谈论的代码片段:

public override string Text
{
    get
    {
        if (this.Text.Contains(" ريال")) {
            return this.Text.Replace(" ريال", "");
        }
        return base.Text;
    }
    set
    {
        base.Text = value;
    }
}

更新:

我遵循了建议的解决方案,其中希望我将所有内容更改this.Textbase.Text. 这样做解决了 Visual Studio 崩溃和“堆栈溢出错误消息”,但我也注意到我覆盖的 onEnter 事件也停止运行!

当我完全注释掉新控件的重写 Text 属性时,该事件再次起作用!这是什么原因造成的?

protected override void OnEnter(EventArgs e)
    {
        if (Mode == Modes.ریالی)
        {
            if (this.Text.Contains(" ريال"))
            {
                this.Text = this.Text.Replace(" ريال", "");
            }
        }
        base.OnEnter(e);
    }
4

4 回答 4

3

你有一个无限循环。您的文本获取器正在获取自身。我认为您的意思是base在几个地方使用而不是this.

    public override string Text
    {
        get
        {
            if (base.Text.Contains(" ريال"))
            {
                return base.Text.Replace(" ريال", "");
            }
            return base.Text;
        }
        set
        {
            base.Text = value;
        }
    }
于 2012-07-28T15:06:17.927 回答
2

在这些行中

            if (this.Text.Contains(" ريال")) 
            { 
                return this.Text.Replace(" ريال", ""); 
            } 

您请求覆盖的控件返回要替换的文本,以防它包含搜索到的字符串。但这会在无限循环中再次触发 GET 访问器。以 stackoverflow 异常结束

改成

            if (base.Text.Contains(" ريال")) 
            { 
                return base.Text.Replace(" ريال", ""); 
            } 
于 2012-07-28T15:06:31.577 回答
1

您正在创建一个无休止的递归

this.Text 

调用 getter,即 getter 在无限循环中调用自己!

更改this.Textbase.Textif测试不是必需的。如果不包含该模式,该Replace方法无论如何都会返回原始文本。

public override string Text
{
    get { return base.Text.Replace(" ريال", ""); }
    set { base.Text = value; }
}
于 2012-07-28T15:06:15.067 回答
1

您需要在 Text 属性中使用局部变量。Text问题是您对property有递归调用this.Text,请base.Text改用。

例子:

public override string Text
        {
            get
            {
                string text = base.Text;
                if (text.Contains(" ريال"))
                {
                    return text.Replace(" ريال", "");
                }
                return base.Text;
            }
            set
            {
                base.Text = value;
            }
        }
于 2012-07-28T15:07:13.400 回答