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( “只读”, “只读”);

}

希望它有帮助。