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

时间:2020-03-05 18:58:59  来源:igfitidea点击:

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

解决方案

回答

我不久前在一个项目中完成了此任务。为此,我创建了一个既包含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的窗体具有工具箱脚本管理器。

回答

我知道这是一个旧线程,但是当我遇到类似问题时才遇到它。这就是我最终实现的,并且效果很好。如果要使控件成为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