TextBox から継承するサーバー コントロールを作成しようとしています。このコントロールには、CalendarExtenderが自動的にアタッチされます。これを行うことは可能ですか、それとも私の新しいコントロールは代わりに CompositeControl から継承する必要がありますか? 私は前者を試しましたが、コントロール ライフサイクルのどの部分で CalendarExtender の新しいインスタンスを作成する必要があるか、どのコントロール コレクションに追加する必要があるかが明確ではありません。それを Page または Form のコントロール コレクションに追加できないようです。(TextBox) コントロールのコレクションに追加すると、ポップアップ カレンダー機能がまったく利用できなくなります。
4 に答える
私はしばらく前にプロジェクトでこれを達成しました。そのために、TextBox と CalendarExtender の両方を含む CompositeControl を作成しました。
CompositeControlのCreateChildControls
メソッドでは、次のようなコードを使用します。
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 を含むフォームにツールキット スクリプト マネージャがあることを確認してください。
カスタム サーバー コントロールに ajax カレンダーを簡単に追加できます。アプリケーションに 2 つの参照を追加する必要があります。1. AjaxControlToolkit.dll 2. System.Web.Extensions 2 番目の参照を使用して、カスタム サーバー コントロールの「CalendarExtender」のすべてのプロパティを取得します。
これは古いスレッドであることは知っていますが、同様の質問をしたときに見つけました。これは私が最終的に実装したものであり、うまく機能します。コントロールを 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
ユーザーがテキストボックスに何も入力できないようにし、カレンダーエクステンダーでのみ入力できるようにしてから、テキストボックスコントロールから選択した日付を取得しようとすると、textboxプロパティをReadOnlyに設定している場合、空の文字列になる可能性があります。 ="真"。
これは、読み取り専用コントロールがサーバーにポストバックされないためです。この回避策は次のとおりです。
保護されたvoidPage_Load(オブジェクト送信者、EventArgs e)
{{
TextBox1.Attributes.Add( "readonly"、 "readonly");
}
それが役に立てば幸い。