2017-10-11 1 views
0

Ich habe eine Reihe von Kontrollkästchen auf meiner Seite, die mit einem Repeater generiert werden. Die Kontrollkästchen sind für jede Datenbank in meiner Web-Konfiguration, und die Idee ist, sie zu verwenden, um auszuwählen, welche Datenbanken zu durchsuchen sind. Ich habe sie von einem Repeater generiert, weil ich möchte, dass mein Code dynamisch ist und in jedem Projekt funktioniert. Daher können Datenbanknamen nicht fest codiert sein, und ich habe keine fest codierten IDs.Abrufen von dynamischen asp.net Checkbox-Steuerelemente - Steuerelemente werden auf Seite im Repeater hinzugefügt, können aber nicht im Postback (C#)

protected void rptDatabases_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     var databaseName = e.Item.DataItem as string; 
     CheckBox checkbox = e.Item.FindControl("checkboxDatabase") as CheckBox; 
     if (checkbox != null) 
     { 
      checkbox.Attributes["data-id"] = databaseName; 
      checkbox.Text = databaseName; 
     } 
    } 

<div class="databases"> 
    <asp:Repeater runat="server" ID="rptDatabases" OnItemDataBound="rptDatabases_OnItemDataBound"> 
     <ItemTemplate> 
      <asp:CheckBox runat="server" ID="checkboxDatabase"/> 
     </ItemTemplate> 
    </asp:Repeater> 

Allerdings kann ich nicht herausfinden, wie die Daten, die ich von ihnen in den Postbacks muß abgerufen werden. Zuerst habe ich versucht, dies:

public List<string> GetSelectedDatabases() 
{ 
    var selectedDatabases = new List<string>(); 
    foreach (var ctrl in form1.Controls) 
    { 
     var checkbox = ctrl as CheckBox; 
     if (checkbox != null) 
     { 
      if (checkbox.Checked) 
      { 
       selectedDatabases.Add(checkbox.Text); 
      } 
     } 
    } 
    return selectedDatabases; 
} 

aber keine Kontrollkästchen gefunden hat, und als ich ging durch, fand ich, dass es kein Kontrollkästchen wurde das Abrufen überhaupt kontrolliert. So änderte ich es von form1.Controls zu rptDatabases.Controls, um die Kontrollen innerhalb des Repeaters zu erhalten. Obwohl dies alle Kontrollkästchen-Steuerelemente abruft, werden sie jedoch als RepeaterItem-Objekte zurückgegeben. In dieser Zeile:

var checkbox = ctrl as CheckBox; 

Checkbox endet als null. Ich kann das RepeaterItem nicht als CheckBox darstellen, und ich kann nicht auf die Text-Eigenschaft zugreifen, die ich brauche, um herauszufinden, welcher Wert hinzugefügt werden soll.

Ich versuchte auch (var ctrl in rptDatabases.Controls.OfType<CheckBox>()), aber das gibt keine Elemente zurück.

Antwort

1

Mit foreach (var ctrl in form1.Controls) erhalten Sie alle Steuerelemente auf der Seite, aber diese Kontrollkästchen befinden sich in einem anderen Steuerelement, so dass es nicht funktioniert.

Sie müssen die RepeaterItem Elemente im Repeater loopen und das Kontrollkästchen in diesem Element suchen.

foreach (RepeaterItem item in rptDatabases.Items) 
{ 
    CheckBox checkbox = item.FindControl("checkboxDatabase") as CheckBox; 

    if (checkbox != null && checkbox.Checked) 
    { 
     selectedDatabases.Add(checkbox.Text); 
    } 
} 
+0

Das ist, bekommen sie, ist aber nicht richtig checkbox.Checked Rückkehr - es ist alles von ihnen zurückkehrt als falsch –

+0

Dann haben Sie wahrscheinlich nicht wickeln Sie die Datenbindung des Repeater innerhalb eines IsPostBack überprüfen 'if (Page.IsPostBack!) {// Repeater hier binden} ' – VDWWD

+0

du hast recht! Vielen Dank! –

Verwandte Themen