我正在尝试创建一个从 TextBox 继承的服务器控件,它将自动附加一个CalendarExtender 。是否可以这样做,或者我的新控件是否需要从 CompositeControl 继承?我已经尝试过前者,但我不清楚应该在控件生命周期的哪个部分创建 CalendarExtender 的新实例,以及应该将它添加到哪个控件集合中。我似乎无法将它添加到 Page 或 Form 的控件集合中,如果我将它添加到 (TextBox) 控件的集合中,我将得不到任何弹出日历功能。
4 回答
我不久前在一个项目中完成了这一点。为此,我创建了一个包含 TextBox 和 CalendarExtender 的 CompositeControl。
在CreateChildControls
CompositeControl 的方法中,我使用与此类似的代码:
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
您可以轻松地在自定义服务器控件中添加 ajax 日历。您需要在应用程序中添加两个引用。1. AjaxControlToolkit.dll 2. System.Web.Extensions 在第二个参考的帮助下,我们将在您的自定义服务器控件中获得“CalendarExtender”的所有属性。
当您尝试不允许用户在文本框中键入任何内容,但只能由日历扩展器填充,然后您尝试从文本框控件获取选定日期时,如果您已将文本框属性设置为 ReadOnly,则它可能是空字符串=“真”。
这是因为只读控件不会发回服务器。解决方法如下:
protected void Page_Load(object sender, EventArgs e)
{
TextBox1.Attributes.Add("readonly", "readonly");
}
希望能帮助到你。