2

テキストまたは数値を受け取るカスタム TextBox を作成する必要があります。PostBack の後、値を確認したいのですが、それが数値でない場合は、TextBox の後ろに "Not Digits!" という言葉でスパンを白くします。値をチェックするプロパティ Number を作成し、問題がなければビューステートに入れ、それ以外の場合は文字列「Not Digits!」を書き込みます。ここにコード:

namespace NumericTextBoxLibraryV2
{
[DefaultProperty("Number")]
[ToolboxData("<{0}:NumericTextBox runat=server></{0}:NumericTextBox>")]
public class NumericTextBox : TextBox
{
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;
            if(!Int32.TryParse(value, out number))
                notNumber = "Digits only!";
        }
    }

    [Bindable(true)]
    [Category("Appearance")]
    //[DefaultValue("")]
    //[Localizable(true)]
    public int Number
    {
        get
        {
            if(ViewState["Number"] == null)
            {
                ViewState["Number"] = 0;
            }
            number = (int)ViewState["Number"];
            return number;
        }

        set
        {
            Match match = Regex.Match(value.ToString(), @"^\d+$");
            if (match.Success)
            {
                ViewState["Number"] = value;
                notNumber = string.Empty;
            }
            else
            {
                notNumber = "Digits only!";
            }
        }
    }

    private int number;
    private string notNumber;

    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write(@"<span>{0}&nbsp;</span><br />", notNumber);
        base.Render(writer);
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(Number);
    }
}
}

質問:ご覧のとおり、Text プロパティからのみ TextBox に書き込まれた値を取得できます。値を Text ではなく、プロパティ Number に設定するコードを記述する方法はありますか? また、Text プロパティではなく Number を表示するにはどうすればよいですか?

4

1 に答える 1

4

はい、実際には の実装に由来するTextBoxのメソッドをオーバーライドする必要があります。これはページのライフサイクルの早い段階で発生し、実際にはそこからコントロールがそのプロパティを取得します。LoadPostDataIPostBackDataHandlerText

そこに飛び込んで、リクエストパラメーターから直接値を取得できます。

ただし、テキスト ボックスを拡張しているため、常に text プロパティがあります。クリーンなバージョンはControl、自分で入力レンダリングを拡張して実行することを意味します。Textプロパティを完全に削除し、自分のNumberプロパティのみを保持します。

コードはよりきれいになり、読みやすくなります。もちろん、それはもう少し作業が必要なことを意味します。Control直接拡張する場合は、実装する必要があることに注意してくださいIPostBackDataHandler。そのインターフェイスは基本的に、コントロールがデータを送り返すことをページに伝え、別の方法で処理する必要があります。

于 2013-05-27T16:51:51.680 に答える