Ajouter dynamiquement CalendarExtender au contrôle de serveur de sous-classe Textbox?
-
01-07-2019 - |
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.
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.