2

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

2

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.

+0

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

+0

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. –

1

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 
1

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.

0

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.