Pergunta

Eu estou tentando criar um controle de servidor, que herda de TextBox, que terá automaticamente um CalendarExtender ligado a ele. É possível fazer isso, ou não minha nova necessidade de controle para herdar de CompositeControl em vez disso? Eu tentei o primeiro, mas eu não sou claro durante o qual parte do controle do ciclo de vida que eu deveria criar a nova instância do CalendarExtender, eo que controla coleção Devo acrescentar que ele. Eu não parecem ser capazes de adicioná-lo à página ou coleção de controles do formulário, e se eu adicioná-lo à coleção do controle (TextBox), recebo nenhuma das funcionalidades de calendário pop-up.

Foi útil?

Solução

Fiz isso em um projeto de uma volta quando. Para fazê-lo, eu criei um CompositeControl que contém a caixa de texto eo CalendarExtender.

No método CreateChildControls do código de uso CompositeControl I semelhante a esta:

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);

É claro make certeza que o formulário que contém este CompositeControl tem um gerente de roteiro toolkit.

Outras dicas

Eu sei que esta é uma discussão antiga, mas me deparei com isso quando eu tinha uma pergunta semelhante. Isto é o que eu acabei implementação, e ele funciona muito bem. Se você deseja que o controle a ser uma caixa de texto, em seguida, basta bombear para fora o extensor durante a chamada para 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

Você pode facilmente adicionar Calendário Ajax em controles de servidor personalizados. Você precisa adicionar dois referência na sua aplicação. 1. AjaxControlToolkit.dll 2. System.Web.Extensions Com a ajuda da segunda referência, vamos obter todas as propriedades de “CalendarExtender” em seus controles de servidor personalizados.

Quando você está tentando não permitir que os usuários digitar nada na caixa de texto, mas apenas ser preenchido pelo extensor de calendário e, em seguida, tentar obter a data selecionada do controle caixa de texto pode ser string vazia se tiver definido a caixa de texto propriedade para ReadOnly = "True".

É porque somente leitura controles não são postadas de volta ao servidor. Solução para isso é a seguinte:

protegido void Page_Load (object sender, EventArgs e)

{

TextBox1.Attributes.Add ( "somente leitura", "somente leitura");

}

Hope isso ajuda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top