2

我試圖創建一個從TextBox繼承的服務器控件,它將自動附加一個CalendarExtender。是否有可能這樣做,或者我的新控件是否需要從CompositeControl繼承?我試過前者,但是我不清楚在控件生命週期的哪個部分,我應該創建CalendarExtender的新實例,以及我應該添加的控件集合。我似乎無法將它添加到Page或Form的控件集合中,並且如果將它添加到(TextBox)控件的集合中,我就不會獲得任何彈出式日曆功能。將CalendarExtender動態添加到Textbox子類服務器控件?

回答

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 2008-09-17 15:02:19

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日曆。您需要在應用程序中添加兩個參考。 1. AjaxControlToolkit.dll 2. System.Web.Extensions 藉助第二個參考,我們將在您的自定義服務器控件中獲取「CalendarExtender」的所有屬性。

0

當您試圖不允許用戶在文本框中鍵入任何內容,但只能由日曆擴展程序填充,然後嘗試從文本框控件獲取選定日期時,如果您已設置textbox屬性爲ReadOnly =「True」。

這是因爲只讀控件不會回發到服務器。解決方法爲這個如下:

保護無效的Page_Load(對象發件人,EventArgs的)

{

TextBox1.Attributes.Add( 「只讀」, 「只讀」);

}

希望它有幫助。