¿Agregar dinámicamente CalendarExtender al control del servidor de subclase Textbox?
-
01-07-2019 - |
Pregunta
Estoy intentando crear un control de servidor, que hereda de TextBox, que automáticamente tendrá un CalendarioExtensor adjunto a.¿Es posible hacer esto o mi nuevo control debe heredar de CompositeControl?Probé lo primero, pero no tengo claro durante qué parte del ciclo de vida del control debo crear la nueva instancia de CalendarExtender y a qué colección de controles debo agregarla.Parece que no puedo agregarlo a la colección de controles de Página o Formulario, y si lo agrego a la colección de controles (Cuadro de texto), no obtengo ninguna de las funciones del calendario emergente.
Solución
Logré esto en un proyecto hace un tiempo.Para hacerlo, creé un CompositeControl que contiene tanto TextBox como CalendarExtender.
En el CreateChildControls
método del CompositeControl Utilizo un código similar a este:
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);
Por supuesto, asegúrese de que el formulario que contiene este CompositeControl tenga un administrador de scripts de kit de herramientas.
Otros consejos
Sé que este es un hilo antiguo, pero lo encontré cuando tenía una pregunta similar.Esto es lo que terminé implementando y funciona muy bien.Si desea que el control SEA un TextBox, simplemente extraiga el extensor durante la llamada a 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
Puede agregar fácilmente un calendario ajax en controles de servidor personalizados.Debe agregar dos referencias en su solicitud.1.AjaxControltoolkit.dll 2.System.Web.Extensions Con la ayuda de la segunda referencia obtendremos todas las propiedades de "CalendAxtender" en sus controles de servidor personalizados.
Cuando intenta no permitir que los usuarios escriban nada en el cuadro de texto, pero solo lo completa el extensor del calendario y luego intenta obtener la fecha seleccionada del control del cuadro de texto, puede ser una cadena vacía si ha configurado la propiedad del cuadro de texto en Solo lectura ="Verdadero".
Es porque los controles de solo lectura NO se publican en el servidor.La solución para esto es la siguiente:
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
TextBox1.Attributes.Add("solo lectura", "solo lectura");
}
Espero eso ayude.