C# Control mit gleichen Namen finden?

03/03/2015 22:24 GeKiller#1
Hey,

ich schreibe grade eine Art Kundenverwaltung und ich will dabei auch natürlich die Möglichkeit geben, mehrere Leute auf einmal hinzuzufügen, indem man das bei einer ComboBox auswählt.

Nun habe ich die Textboxen so benannt:
textBox_FirstName
textBox_FirstName2
textBox_FirstName3
usw ... und das halt bei LastName, Street usw.

Das ganze fängt bei mir in der Schleife bei 3 an, weil der Eintrag Nummer eins immer da ist und 2 auch. Danach will ich die Textboxen dann dementsprechend freigeben oder visible machen.

Das habe ich bis jetzt aber so finde ich die Elemente leider nicht.

Code:
private void HideOrShowControls(bool visible)
{
    string startString = "textBox_";

    for(int i = 3; i <= 8; i++)
    {
        startString += i.ToString();
        TextBox textBox = (TextBox)Controls.Find(startString, true).First();
    
        textBox.Visible = visible;     
    }
}
Wie könnte ich das dann hinkriegen, das er dann alle Textboxen findet? Es sind insgesamt 9 pro Eintrag, also lohnt sich das doch schon oder?
03/04/2015 08:01 Mostey#2
Wenn du doch ohnehin schon die Controls dynamisch hinzufügen willst, würde ich sie überhaupt gar nicht statisch anlegen. Das führt außerdem zu unsauberem Code, weil du genau das selbe dynamisch erledigen kannst, ohne ein Limit von Textboxen zu haben und somit auch nicht mehr darauf angewiesen bist, alle Möglichkeiten statisch hinzuzufügen.

Pseudocode, mehr oder weniger:
Code:
formOnLoad()
{
    for(var i = 0; i < 3; ++i)
        AddTextInput(new TextBox(String.Format("textbox_{0}", Controls.Count + i));
}

OnAddInputButtonClicked()
{
    AddTextInput(new TextBox(String.Format("textbox_{0}", Controls.Count));
}

AddTextInput(TextBox textInput)
{
    textInput.TextChanged += OnInputEntered();
    Controls.Add(textInput);
}

OnInputEntered(EventArgs e, object sender)
{
    var textBox = (TextBox) sender;
    // ...
}
Ist vermutlich genau das, was du vor hast. Die genauen Funktionsparameter habe ich nicht im Kopf, da musst du in den Dokus mal nachsehen.
03/06/2015 12:16 GeKiller#3
Hey,

ich denke, das ich deinen Post verstanden habe, auch wenn ein paar Bezeichnung falsch waren aber danke.

Wenn aber wenigstens 2 "Eintragsblöcker" sowieso immer einblendet, kann man die doch wenistesn statisch anlegen oder?

Wie könnte man das denn dann mit den Abständen regeln, weil diese ja auch alle die gleichen Abstände haben sollen und das auch ein wenig so aussehn soll, wie ich das will.
Ein einzelnen "Eintragsblock" soll dann auch noch einen gewissen Abstand haben, also irgendwie so in der Richtung:
[Only registered and activated users can see links. Click Here To Register...]

So sollte es schon ungefähr aussehen. ;)
Zudem sollen die ganzen anderen Blöcke ja auch nur angezeigt werden, wenn der Benutzer es so will, also wenn er z.B 6 Einträge auswählt. Arbeitet man dann mit Hide? Wie kommt man dann an das Control ran?
03/06/2015 13:17 Mostey#4
Quote:
Originally Posted by GeKiller View Post
Wenn aber wenigstens 2 "Eintragsblöcker" sowieso immer einblendet, kann man die doch wenistesn statisch anlegen oder?
Könnte man sicherlich, allerdings ist das mehr oder weniger überflüssig wenn du doch ohnehin vor hast, die restlichen Blöcke dynamisch anzulegen. Wieso nicht also einfach nachdem die Form angezeigt wurde, die beiden Blöcke genau so hinzufügen, wie du es auch sonst machen würdest, wenn der User einen weiteren Block wünscht?

Quote:
Originally Posted by GeKiller View Post
Wie könnte man das denn dann mit den Abständen regeln, weil diese ja auch alle die gleichen Abstände haben sollen und das auch ein wenig so aussehn soll, wie ich das will.
Ein einzelnen "Eintragsblock" soll dann auch noch einen gewissen Abstand haben, also irgendwie so in der Richtung:
Ist relativ einfach, da jedes Control eine Position haben sollte. Die Dokus helfen dir da bestimmt, eine Koordinate (X/Y bzw. Top/Left) solltest du auf jeden Fall setzen können.

Code:
GetLastTextInput()
{
    // magic
}

AddTextInput(TextBox textInput)
{
    textInput.TextChanged += OnInputEntered();

    var lastTextInput = GetLastTextInput();
    textInput.Position.Y = lastTextInput + 10; // 10 wäre in diesem Fall der vertikale Abstand
    Controls.Add(textInput);
}
Auch hier wieder: Pseudocode. Die genauen Namen der Eigenschaften musst du dir selbst raussuchen. zur GetLastTextInput Methode: Hier hast du mehrere Möglichkeiten. Du kannst theoretisch zu Beginn eine Liste innerhalb der Form anlegen die stets gepflegt wird, wenn du Elemente hinzufügst/entfernst. Da das aber eher unsauber ist, weil du Daten unnötig an 2 Stellen pflegen musst, kannst du dir alle Textboxen innerhalb deiner Form suchen lassen und so die letzte rauspicken. ([Only registered and activated users can see links. Click Here To Register...])



Quote:
Originally Posted by GeKiller View Post
So sollte es schon ungefähr aussehen. ;)
Zudem sollen die ganzen anderen Blöcke ja auch nur angezeigt werden, wenn der Benutzer es so will, also wenn er z.B 6 Einträge auswählt. Arbeitet man dann mit Hide? Wie kommt man dann an das Control ran?
Würde ich nicht. Wenn der User auf einen Button klickt, der das dazugehörige Control entfernt, würde ich es auch entfernen und nicht nur verstecken.

Jede Form hat eine Controls Eigenschaft in der alle Controls vorhanden sind. Darüber könntest du suchen - oder du spezifizierst Gruppen. (z.B. 1 Textbox + 2 zugehörige Buttons für + und -, + handelt dabei generisch und bezieht sich nicht auf die Textbox bzw. den Eintrag). Stichwort UserControl. Das sollte die Frage klären, wie du an das dazugehörige Textbox Element kommst.