2010-06-10 6 views
6

Ich erstellte Benutzersteuerelement. Es hat string[] öffentlichen Eigentum (es kann List<string> oder was auch immer sein). Ich möchte unterstützen, diese Eigenschaft in aspx-Code zu definieren, wenn die Instanz dieses Benutzersteuerelements deklariert wird. Etwas wie dieses:ASP.NET-Benutzersteuerungsliste/Sammlung/Array-Eigenschaft

<uc1:MyControl ID="MyControl1" runat="server"> 
    <MyStringCollectionProperty> 
     <string>My String 1</string> 
     <string>My String 2</string> 
     <string>My String 3</string> 
    </MyStringCollectionProperty> 
</uc1:MyControl> 

Wie man es arbeiten lässt? Danke ...

+1

Was Sie versuchen zu erreichen? Können Sie nicht einfach die Eigenschaft im Code-Behind einstellen? (zB MyControl1.MyCollection = neue Liste {"Foo", "Bar"};) oder, "runat =" server "/> – RPM1984

+0

Natürlich kann ich die Eigenschaft in code-behind als" Emerency-Option "festlegen. Was ich will, ist die UI-Deklaration von der Logik zu trennen. In Bezug auf Ihre zweite Option ("<% = new List ..."). Es funktioniert nicht, da Server-Tags keine "<% %>" -Ausdrücke enthalten können. – zhe

Antwort

0

Durch die explizite Eingabe Ihrer Variablenwerte in das Markup, verbinden Sie direkt mit Ihrem Beispiel Ihre Benutzeroberfläche mit Ihrer Logik.

Wenn sich diese Werte nicht ändern, dann ist es sinnlos, sie in den Mark-up zu setzen - es wäre besser, sie in den Code Ihrer Benutzersteuerung zu schreiben.

Wenn diese Werte bei jedem Laden des Benutzersteuerelements abweichen können, sollten sie aus einer dynamischen Quelle stammen, z. B. Sitzungsstatusvariablen, öffentliche Variablen, Steuerwerte usw. (In diesem Fall würde Ihr Benutzersteuerelement) Wenn diese Werte sich nur zur Entwurfszeit ändern, können Sie sie wie oben beschrieben auf "OnLoad" setzen, aber Sie sollten in diesem Fall überlegen, ob Sie ein "benutzerdefiniertes Steuerelement" erstellen möchten.

Wie auch immer, nicht sicher, was genau Sie erreichen wollen, also hoffen Sie, dass eine dieser Optionen helfen kann.

Viel Glück

+0

Tatsächlich ist diese Eigenschaft nicht eng mit der Geschäftslogik verbunden. Es stellt nur eine der Einstellungen dieses Benutzersteuerelements dar. Das Einstellen dieser Eigenschaft in page_load erfüllt mich jedoch jetzt. :) Danke für Ihren Rat. – zhe

1

Soweit ich weiß, Sie können nicht tun, was Sie mit einem Benutzersteuer tun wollen. Sie müssten ein benutzerdefiniertes Steuerelement schreiben.

Siehe Server Control Properties Example auf MSDN.

1

Hier ist ein Beispiel, wie Sie erreichen können, wonach Sie fragen. Untergeordnete Steuerelemente werden als HTMLGeneric-Steuerelemente eingelesen, sodass Sie sie konvertieren müssen. Beim Einlesen konvertiere ich sie in meine eigene "StringControl" -Klasse. Wenn Sie eine erweiterte Struktur verwenden möchten, können Sie einfach den Konstruktor für das stringcontrol erweitern.

Partial Class UserControlStrings_MyControl 
    Inherits System.Web.UI.UserControl 

    Private _MyStringCollectionProperty As New MyUserControlStringCollectionClass(Me) 

    <PersistenceMode(PersistenceMode.InnerProperty)> 
    Public ReadOnly Property MyStringCollectionProperty As MyUserControlStringCollectionClass 
     Get 
      Return _MyStringCollectionProperty 
     End Get 
    End Property 
End Class 

Public Class MyUserControlStringCollectionClass 
    Inherits ControlCollection 

    Sub New(ByVal owner As Control) 
     MyBase.New(owner) 
    End Sub 

    Public Overrides Sub Add(ByVal child As System.Web.UI.Control) 
     MyBase.Add(New StringControl(child)) 
    End Sub 
End Class 

Public Class StringControl 
    Inherits HtmlGenericControl 

    Sub New(ByVal GenericControl As HtmlGenericControl) 
     MyBase.New() 
     Me.Value = GenericControl.InnerHtml 
    End Sub 

    Public Property Value As String = String.Empty 

    Public Overrides Function ToString() As String 
     Return Value 
    End Function 
End Class 

können Sie dann schauen Sie in die "MyControl1.MyStringCollectionProperty" für alle Werte.

6

Sie können TypeConverterAttribute tatsächlich verwenden, um eine Konverterklasse (StringArrayConverter in diesem Fall) anzugeben.