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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top