动态地将CalendarExtender添加到Textbox子类服务器控件?

时间:2008-09-17 14:24:22

标签: asp.net asp.net-ajax textbox calendar custom-server-controls

我正在尝试创建一个继承自TextBox的服务器控件,它将自动附加CalendarExtender。是否可以这样做,或者我的新控件是否需要继承CompositeControl?我尝试过前者,但我不清楚在控件生命周期的哪个部分我应该创建CalendarExtender的新实例,以及我应该添加它的控件集合。我似乎无法将它添加到Page或Form的控件集合中,如果我将它添加到(TextBox)控件的集合中,我就不会获得任何弹出日历功能。

4 个答案:

答案 0 :(得分: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的表单具有工具包脚本管理器。

答案 1 :(得分: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

答案 2 :(得分:1)

您可以在自定义服务器控件中轻松添加ajax日历。您需要在应用程序中添加两个引用。 1. AjaxControlToolkit.dll 2. System.Web.Extensions 在第二个参考的帮助下,我们将在您的自定义服务器控件中获得“CalendarExtender”的所有属性。

答案 3 :(得分:0)

当您尝试不允许用户在文本框中键入任何内容,但只能由日历扩展程序填充然后您尝试从文本框控件中获取所选日期时,如果您设置了文本框,则它可能是空字符串属于ReadOnly =“True”。

因为只读控件不会发回服务器。解决方法如下:

protected void Page_Load(object sender,EventArgs e)

{

TextBox1.Attributes.Add(“readonly”,“readonly”);

}

希望它有所帮助。