Ich versuche, ein Serversteuerelement zu erstellen, das von TextBox erbt, die automatisch eine CalendarExtender an es angeschlossen wird. Ist es möglich, dies zu tun, oder muss mein neues Steuerelement stattdessen von CompositeControl erben? Ich habe den ersten versucht, aber mir ist nicht klar, in welchem Teil des Control-Lebenszyklus ich die neue Instanz des CalendarExtender erstellen soll und welche Controls-Collection ich hinzufügen soll. Es scheint mir nicht möglich zu sein, es der Steuerelemente-Sammlung von Page oder Form hinzuzufügen, und wenn ich es der Auflistung des Steuerelements (TextBox) hinzufüge, erhalte ich keine Popup-Kalenderfunktionen.Dynamische Hinzufügen von CalendarExtender zum Textbox-Unterklasse-Serversteuerelement?
Antwort
Ich habe dies in einem Projekt vor einiger Zeit erreicht. Um dies zu tun, habe ich ein CompositeControl erstellt, das sowohl die TextBox als auch den CalendarExtender enthält.
Im CreateChildControls
Methode des Composite verwende ich Code wie folgt aus:
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);
Natürlich darauf achten, dass die Form dieses Composite enthält ein Toolkit-Skript-Manager hat.
Ich weiß, das ist ein alter Thread, aber ich stieß darauf, als ich eine ähnliche Frage hatte. Das habe ich umgesetzt, und es funktioniert großartig. Wenn das Steuerelement eine TextBox sein soll, pumpen Sie den Extender während des Aufrufs von Render einfach aus.
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
Sie können problemlos Ajax-Kalender in benutzerdefinierten Serversteuerelementen hinzufügen. Sie müssen zwei Referenzen in Ihrer Anwendung hinzufügen. 1. AjaxControlToolkit.dll 2. System.Web.Extensions Mit Hilfe der zweiten Referenz erhalten wir alle Eigenschaften von "CalendarExtender" in Ihren benutzerdefinierten Serversteuerelementen.
Wenn Sie versuchen, Benutzern nicht zu erlauben, etwas in das Textfeld einzugeben, sondern nur mit der Kalendererweiterung und dann versuchen, das ausgewählte Datum aus dem Textfeldsteuerelement abzurufen, kann es eine leere Zeichenfolge sein, wenn Sie die Option festgelegt haben Textfeldeigenschaft zu ReadOnly = "True".
Seine weil nur Lese-Steuerelemente werden nicht zurück auf den Server gepostet. Abhilfe für dieses ist die folgende:
protected void Page_Load (object sender, EventArgse)
{
TextBox1.Attributes.Add ("Nur-Lese", "nur lesbar");
}
Ich hoffe, es hilft.
Ist dann sicher anzunehmen, dass ich alle Eigenschaften implementieren und an das entsprechende untergeordnete Steuerelement weiterleiten muss. Zum Beispiel, wenn ich die Text-Eigenschaft von der TextBox möchte, implementiere ich es in der CompositeControl und Weiterleiten von Aufrufen an die untergeordnete TextBox? – LockeCJ
Grundsätzlich ja. Wie dem auch sei, Sie möchten, dass die interne TextBox ein Instanzenelement (möglicherweise vor CreateChildControls instanziiert) Ihres CompositeControls sein muss, anders als, wie mein Code es behandelt. –