1

一種の通貨テキストボックスであるTextBox呼び出されたものから新しいコントロールを作成しようとしました。RialiTextBox

問題は、プロパティをオーバーライドして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.Textをに変更してもらいましたbase.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

無限ループがあります。あなたの Text ゲッターはそれ自体を取得しています。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 

ゲッターを呼び出します。つまり、ゲッターは無限ループで自分自身を呼び出します!

に変更this.Textbase.Textます。ifテストは必要ありません。パターンが含まれていない場合でも、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 に答える