2016-06-18 20 views
1

Ich bin immer noch neu mit .NET arbeiten und bin immer noch ein bisschen verwirrt über die Arbeit mit seinem Lebenszyklus, die ich denke, ich muss mit arbeiten, um dieses Problem zu lösen.C#: Zugriff auf dynamische Steuerelemente nach Page_Load

Ich werde eine vereinfachte Version des Codes hinzufügen, wo ich eine Reihe von Kontrollkästchen mit den Zeichenfolgen in einer Liste erstellen muss. Sobald sie erstellt wurden, sollte ich in der Lage sein, einige davon auszuwählen, auf eine andere Schaltfläche zu klicken und die Anzahl der ausgewählten Kontrollkästchen zu erhalten.

Aufgrund des Neuladens der Seite werden die Kontrollwerte des dynamischen Inhalts entfernt, so dass es nicht funktioniert. Ich habe versucht, etwas wie folgt zu verwenden:

ViewState.Add("panelCheckListContainer", CheckListContainer); 

Aber ich bekomme nur Fehler von diesem. Ich habe ähnliche Fragen gesehen, aber ihre Lösungen haben nicht funktioniert oder ich konnte sie nicht funktionieren lassen.

Der Code ist der folgende:

Panel panelCheckListContainer = new Panel(); 

protected void buttonCheck_Click(object sender, EventArgs e) 
{ 
    List<string> results = Get_Rand_Values(); 
    Get_CheckList(results); 
} 


private void Get_CheckList(List<string> results) 
{ 
    CheckBox checkBox; 
    panelCheckListContainer.ID = "correction-check-list"; 
    panelCheckListContainer.CssClass = "checkbox"; 

    foreach (string result in results) 
    { 

     checkBox = new CheckBox(); 
     checkBox.ID = Cypher_MD5(result); 
     checkBox.Text = result; 
     //checkBox.CheckedChanged += new EventHandler(Change); 

     panelCheckListContainer.Controls.Add(checkBox); 

    } 

    checkList.Controls.Add(panelCheckListContainer); 
} 


protected void buttonCount_Click(object sender, EventArgs e) 
{ 
    int i = 0; 
    foreach (Control c in panelCheckListContainer.Controls) 
    { 
     if ((c is CheckBox) && ((CheckBox)c).Checked) 
     { 
      ++i; 
     } 
    } 
    Response.Write("<script>alert('Checked: " + i + "');</script>"); 
} 

Dies ist der Platzhalter, wo die Kontrollkästchen angebracht sind:

<asp:PlaceHolder runat="server" ID="checkList"></asp:PlaceHolder> 

Antwort

0

Wie wir wissen HTTP ist ein zustandsloses Protokoll und ASP.NET geht durch ganze Seite Lebenszyklus für jede Anfrage. Aufgrund dessen initialisiert es ein neues Seitenobjekt mit den Anfangskontrollen. Da dynamische Steuerelemente in der Klassendefinition nicht vorhanden sind und zur Laufzeit instanziiert wurden, werden alle dynamischen Steuerelemente vom Rendern entfernt. Wenn jemand diese dynamische Steuerung beim nächsten Rendervorgang erneut rendern und laden möchte, sollte er sich um den (dynamischen Steuerungsinitialisierungs-) Code beim Ereignis page_load kümmern.

Jetzt möchten Sie den Wert der dynamischen Kontrolle beibehalten, dann können Sie entweder "Anfrage" -Objekt oder "verstecktes Feld" verwenden. Ich habe Code in Ihrem Code-Snippet hinzugefügt.

protected void Button1_Click(object sender, EventArgs e) 
    { 
     List<string> results = Get_Rand_Values(); 
     Get_CheckList(results); 
     Session["results"] = results; 
    } 
    protected void buttonCount_Click(object sender, EventArgs e) 
    { 
     int i = 0; 
     //foreach (Control c in) 
     //{ 
     // if ((c is CheckBox) && ((CheckBox)c).Checked) 
     // { 
     //  ++i; 
     // } 
     //} 
     var results = (List<string>)Session["results"]; 
     foreach (var k in results) 
     { 
      var tmp = Request[Cypher_MD5(k)]; 
      if(tmp == "on") 
      { 
       i++; 
      } 
      count++; 
     } 
     Response.Write("<script>alert('Checked: " + i + "');</script>"); 
    } 
Verwandte Themen