CalendarExtender を Textbox サブクラス サーバー コントロールに動的に追加しますか?
-
01-07-2019 - |
質問
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("読み取り専用", "読み取り専用");
}
それが役に立てば幸い。