2

私は、テキストボックスから継承したサーバーコントロールを作成しようとしていますが、そのサーバーコントロールには自動的にCalendarExtenderが添付されています。これを行うことは可能ですか、または新しいコントロールが代わりにCompositeControlから継承する必要がありますか?私は前者を試しましたが、コントロールライフサイクルのどの部分でCalendarExtenderの新しいインスタンスを作成すべきか、そしてそれを追加するコレクションを制御するものは何であるかはわかりません。私はそれをページやフォームのコントロールコレクションに追加することはできないようですが、それを(TextBox)コントロールのコレクションに追加すると、ポップアップカレンダーの機能はありません。CalendarBoxサブクラスサーバーコントロールにCalendarExtenderを動的に追加しますか?

答えて

2

これをプロジェクトの中でしばらくやり遂げました。これを行うには、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を含むフォームは、ツールキットのスクリプトマネージャを持っていることを確認してください。

+0

適切な子コントロールにプロパティを実装して転送する必要があると想定するのは安全ですか。たとえば、TextBoxからTextプロパティを取得する場合は、CompositeControlでそれを実装し、子TextBoxにコールを転送しますか? – LockeCJ

+0

基本的にはyesです。しかし、内部TextBoxを、自分のCompositeControlのインスタンスメンバー(CreateChildControlsの前にインスタンス化する必要があるかもしれません)にして、自分のコードがそれをどのように扱うのかとは違うものにしたいと思うでしょう。 –

1

私はこれが古いスレッドだと知っていますが、私にも同様の質問がありました。これは私が実装を終えたものであり、素晴らしいことです。コントロールを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 
1

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

0

ユーザーがテキストボックスに何も入力せず、カレンダーエクステンダーでのみ入力できるようにしようとしているときに、テキストボックスコントロールから選択した日付を取得しようとすると、 textboxプロパティをReadOnly = "True"に設定します。

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

保護されたボイドをPage_Load(オブジェクト送信者、のEventArgs電子)

{

TextBox1.Attributes.Add( "読み取り専用"、 "読み取り専用")。

}

希望します。

関連する問題