Question

J'essaie de créer un contrôle serveur héritant de TextBox et qui aura automatiquement un CalendarExtender y est attaché. Est-il possible de faire cela ou mon nouveau contrôle doit-il plutôt hériter de CompositeControl? J'ai essayé le premier, mais je ne sais pas au cours de quelle partie du cycle de vie du contrôle je dois créer la nouvelle instance de CalendarExtender, et à quelle collection de contrôles je dois ajouter. Je ne semble pas pouvoir l'ajouter à la collection de contrôles Page ou Form, et si je l'ajoute à la collection du contrôle (TextBox), je ne reçois aucune des fonctionnalités du calendrier contextuel.

Était-ce utile?

La solution

J'ai réalisé cela dans un projet il y a quelque temps. Pour ce faire, j'ai créé un CompositeControl contenant à la fois le TextBox et le CalendarExtender.

Dans la méthode CreateChildControls de CompositeControl, j'utilise un code similaire à celui-ci:

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

Bien sûr, assurez-vous que le formulaire contenant ce CompositeControl a un gestionnaire de scripts pour la boîte à outils.

Autres conseils

Je sais que c'est un vieux fil de discussion, mais je l'ai trouvé lorsque j'avais une question similaire. C'est ce que j'ai fini par mettre en œuvre et cela fonctionne très bien. Si vous souhaitez que le contrôle soit une zone de texte, extrayez simplement le répéteur lors de l'appel à 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

Vous pouvez facilement ajouter un calendrier ajax aux contrôles de serveur personnalisés. Vous devez ajouter deux références dans votre application. 1. AjaxControlToolkit.dll 2. System.Web.Extensions Avec l'aide de la deuxième référence, nous obtiendrons toutes les propriétés de «CalendarExtender» dans vos contrôles de serveur personnalisés.

Lorsque vous essayez de ne pas autoriser les utilisateurs à taper quoi que ce soit dans la zone de texte, mais que vous ne remplissiez que par l'extension du calendrier, puis que vous essayez d'extraire la date sélectionnée du contrôle de la zone de texte, cette chaîne peut être vide si vous avez défini la zone de texte. property to ReadOnly = " True ".

C’est parce que les contrôles en lecture seule ne sont PAS envoyés au serveur. La solution de contournement est la suivante:

Void Page_road protégé (expéditeur d'objet, EventArgs e)

{

TextBox1.Attributes.Add ("readonly", "readonly");

}

J'espère que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top