2009-05-27 10 views
0

Ich möchte ein benutzerdefiniertes Containersteuerelement in ASP.NET (ähnlich einem Panel) mit einem Kontrollkästchen als eine Kopfzeile erstellen, die alle enthaltenen Steuerelemente deaktiviert deaktiviert.Wie erstelle ich ein benutzerdefiniertes Panel mit einem Kontrollkästchen in ASP.NET

Wie würde ich das machen?

EDIT:

auf meinen Anforderungen zu erweitern, ich brauche so etwas wie Rob vorgeschlagen, das heißt ein Benutzersteuerelement ein CheckBox und einen Content-Panel enthält. Es sollte jedoch funktionell einem Panel ähneln, da ich das Steuerelement wiederverwenden und in jeder Instanz unterschiedliche Inhalte definieren muss. Es ist schwer zu erklären, sorry für das scheinbare "Feature Creep".

Antwort

2

Wenn ich mich richtig erinnere, deaktivieren Sie das Panel [mit der aktivierten Eigenschaft], wenn das Kontrollkästchen deaktiviert ist, wird dies die Elemente im Panel deaktivieren. Sie müssen dann nicht alle Elemente innerhalb des Bereichs einzeln deaktivieren. Wenn Sie das Bedienfeld erneut aktivieren, werden die untergeordneten Steuerelemente wieder aktiviert.

myPanel.Enabled = false; //Child controls disabled 
myPanel.Enabled = true; //Child controls enabled 

Sie könnten auch jede Steuerung innerhalb der Platte durchlaufen mit:

foreach(Control control in myPanel) 
{ 
    //Assume for the purpose of demonstration 
    //that each control within myPanel has an 
    //"Enabled" property 
    control.Enabled = myPanel.Enabled; 
} 

Dadurch wird die Eigenschaft enabled jeder Kontrolle innerhalb der Platte, dass der Platte übereinstimmen setzen würde - wirklich, ist dieser Überschuss zu Anforderung und ist daher nicht wirklich wünschenswert. Ich habe diese Methode nur zu Demonstrationszwecken bereitgestellt.

Edit: Dies könnte [zum Beispiel] erweitert werden, indem Robs Entwurf für eine Benutzersteuerung, die Sie eine Eigenschaft zu Ihrer Benutzersteuerung hinzufügen könnten die Controls-Auflistung des Panels aussetzen:

public Control[] Controls 
{ 
    return controlPanel.Controls; 
} 

Dies würde im Wesentlichen ermöglichen die Änderung der Steuerelemente des Steuerelements außerhalb des Benutzersteuerelements und erfordern nicht, dass die Steuerelemente in der Steuerfelddefinition innerhalb des Benutzersteuerelements zugewiesen werden.

2

ich ein Usercontrol mit folgendem schaffen würde:

<asp:UpdatePanel ID="upDisableAllPanel" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
     <asp:CheckBox AutoPostBack="true" ID="cbTogglePanel" runat="server" /> 
     <asp:Panel ID="pnlDisableAll" runat="server"> 
     ... controls here ... 
     </asp:Panel> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Im Code-behind Fügen Sie diese (VB Probe)

Public MyControls As New ControlCollection(Me) 

Protected Sub control_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    bindControls() 
End Sub 

Protected Sub cbTogglePanel_CheckChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbTogglePanel.CheckChanged 
    pnlDisableAll.Enabled = cbTogglePanel.Checked 'Or Not cbTogglePanel.Checked depending on how you have the cb labeled.' 
End Sub 

Public Sub bindControls() 
    If MyControls IsNot Nothing And MyControls.Count > 0 Then 
     pnlDisableAll.Controls.Clear() 
     For Each cntrl As Control In MyControls 
      pnlDisableAll.Controls.Add(cntrl) 
     Next 
    End If 
End Sub 

@balabaster richtig ist, dass das Panel zu deaktivieren alles effektiv deaktivieren wird Innerhalb. Dies kapselt es in einen wiederverwendbaren Behälter.

In diesem Code wird davon ausgegangen, dass Sie .Net 3.5 oder .Net 2 mit der Ajax.Net-Bibliothek verwenden und einen ScriptManager irgendwo auf der Inhaltsseite oder der Masterseite deklariert haben. Sie sind mit Ajax richtig?

+0

Schöne, saubere Lösung, erwähnenswert, dass Sie nicht brauchen * Ajax für Ihre Lösung zu arbeiten, würde es nur ein wenig benutzerfreundlicher machen. – BenAlabaster

+0

Ich werde ständig beschuldigt, meinen Nutzern gegenüber zu nett zu sein. –

+0

+1 obwohl für ein gutes Beispiel für die Umsetzung dieser – BenAlabaster

1

Ich denke, ich würde über dieses Problem anders gehen, ich glaube nicht, dass das UserControl mit einem Panel/Checkbox darin funktioniert, wie Sie es wollen, weil Sie nicht in der Lage sein werden, andere Steuerelemente leicht hinzuzufügen .

Stattdessen würde ich einen Ajax Extender für die Checkbox Steuerversorgung ein Panel als ein Argument dazu erstellen.Dann, wann immer die Checkbox angeklickt wurde, müssen Sie jedes der Panels untergeordneten Steuerelemente mit Code wie diesem besuchen;

foreach(Control c in pnlFoo.Controls) 
{ 
    if (!(c is Checkbox)) // probably need a better check than this 
    {     // incase you have other checkboxes inside your panel 
     c.Enabled = chkToggler.Checked; 
    } 
} 
Verwandte Themen