Hallo,
ich möchte dynamisch nach einer Textbox mit einem bestimmten namen suchen, diese selektieren&beschreiben. Ungefähr so:
foreach this.activecontrol
{
if (this.activecontrol.name = "textbox_x01")
{
this.activecontrol.text=data;
}
else
{
this.activecontrol ++;
}
}
der Syntax ist natürlich in diesem Beispiel falsch. Aber ich glaube ihr versteht mein anliegen. Wie kann ich diese Funktion realisieren?
Danke, Chris
Hallo,
ob solch ein Verweis immer weiterhilft, halte ich für fraglich ...
Anbei ein kleines Beispiel :
TextBox found = null;
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
if (c.Name == "textBox1")
{
found = (TextBox)c;
break;
}
}
}
found.Text = "Gefunden";
Hallo a957m,
ob solch ein Verweis immer weiterhilft, halte ich für fraglich ...
vielen Danke für deine Bemühung. Trotzdem sollte die Frage erlaubt sein, wieso nicht? Wenn man den Verweisen in der FAQ folgt, findet man ein Code-Beispiel, dass sogar - mit Verlaub - deutlich sinnvoller ist als deins.
Wenn man davon ausgehen kann, dass c.Name gesetzt ist, sollte man per Controls ["textBox1"] zugreifen, was deutlich schneller und gleichzeitig einfacher geht als mit foreach.
herbivore
Hinweis:
Es geht auch mit
Control[] control = FormAufDerGesuchtWird.Controls.Find("NameDesControls", false);
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Original von a957m
Hallo,ob solch ein Verweis immer weiterhilft, halte ich für fraglich ...
Anbei ein kleines Beispiel :
TextBox found = null; foreach (Control c in this.Controls) { if (c is TextBox) { if (c.Name == "textBox1") { found = (TextBox)c; break; } } } found.Text = "Gefunden";
Danke für dein Beispiel. Diesen Ansatz hatte ich auch anfangs realisiert:
foreach (Control controlNext in this.Controls)
//for (int i = 1; i < 200; i++)
{
//controlNext = this.GetNextControl(controlNext, true);
if (controlNext is TextBox)
{
if (controlNext.Name.IndexOf("Data") != -1)
{
if (spiTxtNameString == null)
{
spiTxtNameString = spiTxtNameString + controlNext.Name + ",";
spiTxtAddrString = spiTxtAddrString + controlNext.Name.Substring(controlNext.Name.Length-2) + ",";
}
else
{
if (spiTxtNameString.IndexOf(controlNext.Name) == -1)
{
spiTxtNameString = spiTxtNameString + controlNext.Name + ",";
spiTxtAddrString = spiTxtAddrString + controlNext.Name.Substring(controlNext.Name.Length - 2) + ",";
}
else
{
//i = 200;
break;
}
}
}
}
}
Problem dabei, er selektiert nur Panels und Buttons, aber nicht meine Textboxen aufm FOrmular?! Daher habe ich es mit einer For--Schleife realisiert, und
controlNext = this.GetNextControl(controlNext, true);
damit geht es auch. Besser wäre noch, wenn ich die Anzahl der Elemente wüsste. Gibt es den Befehl?
nach dem Motto: this.Controls.count;
Danke Chris
Hallo Chris,
Original von pgxn84
Problem dabei, er selektiert nur Panels und Buttons, aber nicht meine Textboxen aufm FOrmular?!
Es sollte sich herumgesprochen haben, dass mit Controls nur die unmittelbar enthaltenen Elemente gefunden werden. Alle Beispiele für FindControl u.ä. betonen, dass rekursiv gearbeitet werden muss.
Deshalb hat dr4g0n76 folgenden Vorschlag gemacht:
Original von dr4g0n76
Control[] control = FormAufDerGesuchtWird.Controls.Find("NameDesControls", false);
In :rtfm: Control.ControlCollection.Find-Methode ist zu lesen, dass mit dem 2. Parameter die untergeordneten Ebenen einbezogen werden können.
Original von pgxn84
Besser wäre noch, wenn ich die Anzahl der Elemente wüsste. Gibt es den Befehl?nach dem Motto: this.Controls.count;
Nicht dass ich wüsste. Das ist wegen der notwendigen Rekursion auch fast unmöglich.
Gruß Jürgen