質問

TextBox から継承するサーバー コントロールを作成しようとしています。 カレンダーエクステンダー それに付属しています。これを行うことは可能ですか、それとも新しいコントロールは代わりに CompositeControl から継承する必要がありますか?前者を試しましたが、コントロールのライフサイクルのどの部分で CalendarExtender の新しいインスタンスを作成する必要があるのか​​、またそれをどのコントロール コレクションに追加する必要があるのか​​が明確ではありません。これをページまたはフォームのコントロール コレクションに追加できないようです。また、(TextBox) コントロールのコレクションに追加しても、ポップアップ カレンダー機能は一切利用できません。

役に立ちましたか?

解決

私は少し前のプロジェクトでこれを達成しました。これを行うために、TextBox と CalendarExtender の両方を含む CompositeControl を作成しました。

の中に CreateChildControls CompositeControl のメソッドでは、次のようなコードを使用します。

TextBox textbox = new TextBox();
textbox.ID = this.ID + "Textbox";
textbox.Text = this.EditableField.TextValue;
textbox.TextChanged += new EventHandler(HandleTextboxTextChanged);
textbox.Width = new Unit(100, UnitType.Pixel);
CalendarExtender calExender = new CalendarExtender();
calExender.PopupButtonID = "Image1";
calExender.TargetControlID = textbox.ID;
this.Controls.Add(textbox);
this.Controls.Add(calExender);

もちろん、この CompositeControl を含むフォームにツールキット スクリプト マネージャーがあることを確認してください。

他のヒント

これが古いスレッドであることは承知していますが、同様の質問があったときに見つけました。これが私が最終的に実装したもので、非常にうまく機能します。コントロールを TextBox にしたい場合は、Render の呼び出し中にエクステンダーをポンプアウトするだけです。

Imports System.Web.UI.WebControls
Imports AjaxControlToolkit

Public Class DateTextBox
    Inherits TextBox

    Private _dateValidator As CompareValidator
    Private _calendarExtender As CalendarExtender

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)

        _dateValidator = New CompareValidator
        With _dateValidator
            .ControlToValidate = ID
            Rem set your other properties
        End With
        Controls.Add(_dateValidator)

        _calendarExtender = New CalendarExtender
        With _calendarExtender
            .TargetControlID = ID
        End With
        Controls.Add(_calendarExtender)
    End Sub

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(writer)
        _dateValidator.RenderControl(writer)
        _calendarExtender.RenderControl(writer)
    End Sub
End Class

カスタム サーバー コントロールに Ajax カレンダーを簡単に追加できます。アプリケーションに 2 つの参照を追加する必要があります。1.ajaxcontroltoolkit.dll 2。System.Web.Extensions 2番目の参照の助けを借りて、カスタムサーバーコントロールで「CalendarExtender」のすべてのプロパティを取得します。

ユーザーがテキスト ボックスに何も入力できないようにし、カレンダー エクステンダーによってのみ入力できるようにし、テキスト ボックス コントロールから選択した日付を取得しようとすると、テキスト ボックス プロパティを ReadOnly に設定している場合、空の文字列になる可能性があります。 「本当です」。

これは、読み取り専用コントロールがサーバーにポストバックされないためです。この問題の回避策は次のとおりです。

protected void Page_Load(オブジェクト送信者, EventArgs e)

{

TextBox1.Attributes.Add("読み取り専用", "読み取り専用");

}

それが役に立てば幸い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top