Durchlaufen Steuerelemente in einem panel C#
Habe ich gesehen, dass viele andere mit ähnlichen Problemen, aber ich kann nicht finden den Fehler in meiner Logik hier. Jegliche Hilfe würde sehr geschätzt werden.
Ich habe ein Panel, welches ich Hinzugefügt haben zahlreiche label und textbox-Steuerelemente zu, dh:
myPanel.Controls.Add(txtBox);
Diese Steuerelemente werden erstellt und Hinzugefügt, in der eine Methode aufgerufen, vor der iteration-Methode.
Möchte ich Durchlaufen jedes Textfeld und verwenden Sie die Text-Eigenschaft als parameter in einer anderen Methode, aber ich bin nicht mit jeder Glück. Hier ist mein Versuch, zu iterieren:
public void updateQuestions()
{
try
{
foreach (Control c in editQuestionsPanel.Controls)
{
if (c is TextBox)
{
TextBox questionTextBox = (TextBox)c;
string question = questionTextBox.Text;
writeNewQuestionToTblQuestions(question);
}
}
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
}
Das problem, das ich habe ist, dass die Steuerelemente nicht in der Systemsteuerung, wenn ich ankomme bei diesem updateQuestions () - Methode. Hier ist der Prozess beteiligt:
Einen commandButton geklickt wird und die Fragen werden Lesen aus einer DB, für jede Frage eine Methode aufgerufen wird, die fügt 2 labels und ein Textfeld editQuestionsPanel.Controls. Dieses panel ist in einem Platzhalter, die dann sichtbar gemacht.
Wenn eine Schaltfläche innerhalb des Platzhalters klicken, wird die updateQuestions () - Methode aufgerufen, und die editQuestionsPanel.Controls.Count = 1. Da sind ca 12 Fragen in der DB-es sollte um die 36. Die ein Steuerelement innerhalb des Panel-Typ:
System.Web.UI.LiteralControl
Es enthält keine Bedienelemente.
Ich bin sicher, dass irgendwo im Lebenszyklus der Panel-Steuerelemente werden deaktiviert, aber ich weiß nicht, wie Sie Schritt durch den Lebenszyklus. Ich habe eine Page_load-Methode, die aufgerufen wird, sobald auf eine Schaltfläche geklickt wird, aber sobald die-Taste, die Anrufe updateQuestions() geklickt wird die editQuestionsPanel.Controls.Zählen ist schon wieder auf 1, damit es geklärt werden muss, bevor diese, aber ich weiß nicht, wie diese zu beheben...
Jede Hilfe, die Sie geben können mir helfen, dieses Problem lösen wäre sehr dankbar - Ihr bringt mich um!
- Was ist es, das nicht funktioniert?
- Dein code funktioniert bei mir. Versuchen Sie, erstellen eine app, die macht genau das, was Sie skizziert haben, und wenn es nicht funktioniert, poste die ganze Sache.
- Als seitliche Anmerkung, die Sie verwenden sollten
as
stattis
hier. Jetzt sind Sie Gießen die variablec
zweimal. Versuchen SieTextBox questionTextBox = c as TextBox; if (questionTextBox != null) { ... }
Dadurch vermeiden Sie eine unnötige Besetzung. - Meine Wette ist, dass Sie einen Lebenszyklus-problem, oder dass
myPanel
ist nichteditQuestionsPanel
. Zu diagnostizieren lifecycle-Probleme, debugger und prüfen Sie die Steuerelemente-Sammlung auf Ihrem panel an verschiedenen Lebenszyklus-Ereignisse (OnInit, OnLoad, OnPreRender, OnRender -, event-Handler, etc.), Besondere Aufmerksamkeit zu widmen, wenn die controls-Auflistung wird gelöscht. - Ich denke, es ist ein life-cycle-problem, die Steuern zählen, ist 37, nachdem Sie Hinzugefügt wurden. Wie kann ich Schritt für Schritt durch die Stufen.. Wie setze ich einen Haltepunkt am Anfang der OnInit-und step-thru, um zu sehen, wo wird es deaktiviert?
- Wo sind Sie bei der Erstellung der Textfelder? Seite Laden? Auch, wo sind Sie zu Lesen versucht, Ihnen aus? Ein click-Ereignis?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie fügen Sie Steuerelemente dynamisch, die Sie benötigen, zu tun, die auf jeder Anfrage - asp.net nicht für Sie tun!
Fügen Sie die Steuerelemente in der Init-oder Load-phase, dann werden Sie wird bekommen, aufgefüllt mit den postback-Werte.
Dieser wählt aus der Sammlung steuert nur, dass die vom Typ TextBox.
(das gleiche wie
control is TextBox
oder(control as TextBox) != null
)Wenn Steuerelemente in
editQuestionsPanel.Controls
:Wählen Sie alle untergeordneten Steuerelemente verwenden, die nächste Erweiterung-Methode:
Mit:
Collection.Controls.Add/Remove/Clear
Ein Häufig gemachter Fehler:
Container.Controls
enthält nur die erste Ebene der untergeordneten Steuerelemente in diesem container. Das ist: TextBox1 in panela reichen, panela reichen in PanelB, Sie können sich nicht TextBox1 in PanelB.Controls.Meine Lösung ist für das schreiben einer extension Methode:
Nun TextBox1 wird in
PanelB.AllControls()
. So filtern Sie alle Steuerelemente mit der Art, mitPanelB.AllControls().OfType<TextBox>()
Wenn die anderen Antworten nicht helfen, versuchen Sie dabei Ihren code, sondern fügen Sie recursivity. Dein code würde nicht funktionieren, wenn die editQuestionsPanel => Systemsteuerung => Textbox
Können Sie so etwas tun, statt:
Versuchen, diese