Laden...

Auf bestimmtes Label über den durchnummerieren Namen zugreifen

Inaktiv Geschlossen
9 Antworten
1,573 Aufrufe
Letzter Beitrag: vor 14 Jahren
Auf bestimmtes Label über den durchnummerieren Namen zugreifen

Ich habe versucht die Lables P1-P5 je nach Auswahl in einer ListBox umbenennen. Dabei wird erst eine TextBox mit zur Auswahl gehörigen Parametern erstellt und dann diese Parameter als eine Reihe von Lables dargestellt. Hier ist der Code dazu:

       private void P_Name_List_SelectedIndexChanged(object sender, EventArgs e)
        {
            Regex rgx1 = new Regex("&");
            Regex rgx2 = new Regex("%");
            Regex rgx3 = new Regex(P_Name_List.SelectedItem.ToString());
            FileHandling FH = new FileHandling();
            string input = FH.ReadFile(@"C:\ProtocolList.ini");
            string[] substrings = rgx1.Split(input);
            string input_par;
            string[] input_par2;
            
            for (int i = 1; i < substrings.Length; i++)
            {
                if (rgx3.IsMatch(substrings[i]))
                {
                    Param_List.Text = "";
                    StringReader sr = new StringReader(substrings[i]);
                    while (sr.Peek() >= 0)
                    {
                        input_par = sr.ReadLine();
                        MatchCollection matches = rgx2.Matches(input_par);
                        for (int j = 0; j < matches.Count; j++)
                        {
                            input_par2 = rgx2.Split(input_par);
                            Param_List.Text += input_par2[1] + "\r\n";
                            
                            foreach (Control c in this.Controls)
                            {
                                if (c.Name == ("P" + j + 1) && c is Label)
                                {
                                    c.Text = input_par2[1];
                                }
                            }
                        }


                    }
                }
            }

Damit kriege ich keine Fehler, die Lables ändern sich aber auch nicht. Was mache ich falsch?

Besster Dank für jede Hilfe!
Dina

Debuggen wäre mal angesagt. Dabei dann mal "c.Name == ("P" + j + 1)" genau anschauen.

da habe ich schon alles mögliche versucht. In dem Fall würde es vielleicht mit den Indizes was falsch laufen und es würden sich nicht die richtigen Lables ändern, aber bei mir passiert gar nichts... Deswegen dachte ich, dass grundsätzlich was falsch mache...

Hallo dinazavric,

du meinst vermutlich "P" + (j + 1)

Verwende aber sowieso besser ein Array. Siehe [FAQ] Variablennamen zur Laufzeit zusammensetzen.

herbivore

du meinst vermutlich "P" + (j + 1)

Habe nun ("P" + j + 1) mit dem Vorgeschlagenen ersetzt. Das erste Label hat sich auch gleich geändert und alle Zuweisungen nach einander gesammelt. Sprich: Was das letzte Label kriegen sollte stand zum Schlüss beim ersten. Da muss ich weiter schauen. Vielen Dank für den Tip 👍

Was die Arrays angeht habe ich es auch schon versucht, aber mit den Controls wird es etwas komplizierter, da komme ich als Anfänger durch einander. Wollte erst doch lieber was einfaches versuchen, falls es überhaupt funkzionieren sollte 🤔

Kann es sein das du statt j, i nehmen wolltest?
Wie gesagt einfach mal Schritt für Schritt debuggen und anschaun was in den entsprechenden Variablen steht.

Kann es sein das du statt j, i nehmen wolltest?
Wie gesagt einfach mal Schritt für Schritt debuggen und anschaun was in den entsprechenden Variablen steht.

Habe in der Zwischenzeit den Fehler entdeckt. So ähnlich war es auch, dass ich das falsche Index genommen habe. Hier ist der Code, vomit es endlich geklappt hat!

Danke an alle!!! 😁


        private void P_Name_List_SelectedIndexChanged(object sender, EventArgs e)
        {
            Regex rgx1 = new Regex("&");
            Regex rgx2 = new Regex("%");
            Regex rgx3 = new Regex(P_Name_List.SelectedItem.ToString());
            FileHandling FH = new FileHandling();
            string input = FH.ReadFile(@"C:\ProtocolList.ini");
            string[] substrings = rgx1.Split(input);
            string input_par;
            int Index = 0;

            for (int i = 1; i < substrings.Length; i++)
            {
                if (rgx3.IsMatch(substrings[i]))
                {
                    Param_List.Text = "";
                    label2.Text = "Paramerters of " + P_Name_List.SelectedItem.ToString();
                    StringReader sr = new StringReader(substrings[i]);
                    while (sr.Peek() >= 0)
                    {
                        input_par = sr.ReadLine();
                        MatchCollection matches = rgx2.Matches(input_par);
                        for (int j = 0; j < matches.Count; j++)
                        {
                            Index += 1;
                            P_type.Text = "" + Index;
                            Param_List.Text += rgx2.Split(input_par)[1] + "\r\n";
                            foreach (Control c in this.Controls)
                            {
                                if (c.Name == ("P" + Index) && c is Label)
                                {
                                    c.Text = rgx2.Split(input_par)[1];
                                    break;
                                }


                            }
                        }
                    }
                }
            }

Hallo,

Regex rgx1 = new Regex("&");
Regex rgx2 = new Regex("%");
Regex rgx3 = new Regex(P_Name_List.SelectedItem.ToString());

also wirklich nichts gegen die Verwendung von regulären Ausdrücken, aber für Ausdrücke bzw. strings, die keine regulären Ausdrücke sind, ist das erstens Overhead und total falsch angewendet.

string[] substrings = rgx1.Split(input);

kann man z.B. ganz leicht durch das ersetzen:

string[] substrings = input.Split(new char[] {'&'});

Marko

Hallo,

oder noch einfacher:

string[] substrings = input.Split('&');

Grüße, Koller.

Thema geschlossen