Autor Beitrag
Lihlu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Mo 24.02.14 16:21 
Hallos zusammen,

folgendes:

ich habe eine WindowsForms Anwendung wo ca. 35 Checkboxen sind. Nun wenn man auf einen Button klickt, soll überprüft werden welche angehakt sind und welche nicht.

Bei einer geht es ja so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
if (CheckBox.Checked) 


else 
{
}


Nur wie kann ich da einbauen das er direkt alle überprüft,in der Form ?

Freue mich gierig auf eure Antworten :p

Gruß
Lihlu

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.02.14 16:48 
Hallo,

die Gegenfrage ist, was willst du dann damit tun?
Wäre evtl. eine CheckedListBox für eine Liste nicht besser, denn dort gibt es die passende Eigenschaften CheckedItems und CheckedIndices sowie die Methode GetItemChecked(int index) (die du dann in einer Schleife abarbeiten könntest)?

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 08:32 
Hey Danke für deine Antwort,

anbei habe ich ein kleines Bildchen :p
Beschreibung (jpg, 97.4 KB)

Also ich möchte, das wenn eine der Boxen angeharkt ist, ein Ping auf dessen Namen abgesendet wird. Wenn er erreichbar ist passiert nichts - doch wenn der Ping nicht durch kommt wird ein Fehler ausgegeben. Soweit klappt das auch mit der ersten CheckBox. Nur damit der Ping an alle angeharkten gesendet wird, muss ich wissen wie ich das anstelle o:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (CheckBox.Checked) 

PING sneden

else 
{
Ping nicht senden
}


EDIT: Der Scan Button o:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
 private void button1_Click(object sender, EventArgs e)
        {
            Statuslbl.Text = "Sarting Scan";
            Statuslbl7.Text = "Status: Versuche die Aufgabe zu bewältigen. Siehe Status für Infos oder Fehler.";

            if (checkBox1.Checked)
            {
                Statuslbl1.Text = "Checking Boxes";

                // Check Box Aktionen
                try
                {

                    Statuslbl2.Text = "Ping start";
                    Ping Sender = new Ping();
                    PingReply Result = Sender.Send(checkBox1.Text);
                    if (Result.Status == IPStatus.Success)
                        Statuslbl6.Text = "Server OK";
                    else
                        MessageBox.Show(checkBox1.Text + " ist nicht zur erreichen. Error 3");
                
                }
                catch
                {

                    MessageBox.Show(checkBox1.Text + " ist nicht zur erreichen. Error 1");
                    Statuslbl5.Text = "Error 1"//CheckBox Error
                

                }
            }
            else
            {
                //CheckBox is not checked 
                Statuslbl.Text = "ERROR";
                Statuslbl7.Text = "Status: Wähle einen Server aus und Hake ihn an!";
            }
          


        }


Ziel soll irgendwann sein, das die Anwendung im Hintergrund läuft und alle 10sec einen Ping auf die angehakten Server sendet. Sollte einer nicht zu erreichen sein öffnet sich eine msgBox.
Der Laden button soll einfach eine .TXT laden die die Namen der CheckBoxen ändert (checkBox.Text="Servername";) und somit den Ping ändert. (Der speicher Button speichert die derzeitigen CheckBox Namen in einer Txt.)Speichern und Laden sollte kein problem für mich sein solange ich das mit den CheckBoxen irgendwie gebacken kriege o:
Soweit der Plan :O
Ich bin kein Meister in Programmieren und kann das nur leider nur mit meinen Anfänger skills lösen. Deswegen bitte keine "knallharten" Antworten bitte :p

Danke
Gruß
Lihlu

Moderiert von user profile iconChristian S.: Bild bei uns hochgeladen
Einloggen, um Attachments anzusehen!
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Di 25.02.14 10:05 
Hallo Lihlu,

du könntest mittels einer foreach Schleife über die Controls iterieren ...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
foreach (Control item in this.Controls)
{
     if (item is CheckBox)
     {
          tu was.... (in deinem Fall Pingen)
     }
}


MfG

_________________
the quiter you become, the more you are able to hear
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 10:18 
Hey! Danke für deine Antwort,

aber das verstehe ich noch nicht so ganz. Da ich nicht so ganz verstehe was da passiert, habe Ich die schleife mal eingebaut:

Die Wirkung war, das sich der Ping unendlich wiederholt egal ob eine CheckBox angehakt ist oder nicht.

Magst du mir das mit den "Controls iterieren" etwas genauer erläutern ? Vllt mache ich ja etwas falsch, da ja eig "item is CheckBox in der Schleife drinne steht :O
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 25.02.14 10:22 
Zeig doch einfach mal, wie Du es eingebaut hast :)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 10:29 
Alles klar :p

Ich habe es jetzt noch mal ein wenig geändert.

Der Effekt ist nun, das sich der Ping wiederholt wenn die erste CheckBox angehakt ist - soweit so gut :D
Jetzt muss ich nur noch einen weg finden, wie ich das mit allen weiteren CheckBoxen machen kann ohne für jede einzelne Box den gleichen Code zu benutzen.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
 //Start Scan Button
        private void button1_Click(object sender, EventArgs e)
        {

            // Schleife
            foreach (Control item in this.Controls)
{
     if (item is CheckBox)
     {

         Statuslbl.Text = "Starte vorgang";
         Statuslbl7.Text = "Status: Versuche die Aufgabe zu bewältigen. Siehe Status für Infos oder Fehler.";

         if (checkBox1.Checked)  // Kann ich hier nicht irgendwie alle manuell rein schreiben ?
         {
             Statuslbl1.Text = "Überprüfe Boxen";

             // Angehakt
             try
             {

                 Statuslbl2.Text = "Ping start";
                 Ping Sender = new Ping();
                 PingReply Result = Sender.Send(checkBox1.Text);
                 if (Result.Status == IPStatus.Success)
                     Statuslbl6.Text = "Server OK";
                 else
                     MessageBox.Show(checkBox1.Text + " ist nicht zur erreichen. Error 3");

             }
             catch
             {

                 MessageBox.Show(checkBox1.Text + " ist nicht zur erreichen. Error 1");
                 Statuslbl5.Text = "Error 1"//CheckBox Error


             }
         }
         else
         {
             //CheckBox is not checked 
             Statuslbl.Text = "ERROR";
             Statuslbl7.Text = "Status: Wähle einen Server aus und Hake ihn an!";
         }

        
               
       
     }
}


Gruß
Lihlu
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Di 25.02.14 10:49 
Du greifst in der Schleife immer auf die selbe CheckBox zu ....
Du musst in deiner Schleife die aktuelle CheckBox nehmen mit
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
foreach(Control item in this.Controls)
{
   CheckBox chkControl;
   if(item is CheckBox)
   {
       //Hier hast du die aktuelle CheckBox über die gerade iteriert wird
       chkControl = item;
       if(chkControl.IsChecked)
       {
  //Hier was passieren soll also pingen am besten in einem eigenen Thread oder Backgroundworker
       }
   }
}

Ich hoffe das hilft dir ein wenig weiter ...

MfG

_________________
the quiter you become, the more you are able to hear

Für diesen Beitrag haben gedankt: Lihlu
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.02.14 10:56 
In der Schleife ist jetzt item die CheckBox die kannst du befragen anstatt die jeweilige Variable(z.B. checkBox1) die für eine CheckBox steht.
Das funktioniert aber auch nur wenn die CheckBoxen direkt auf der Form liegen. Dein Screenshot sieht so aus als ob da GroupBoxen dazwischen liegen.
Eine Abfrage von this.Controls liefert nur die Controls die direkt auf this liegen. Die CheckBoxen liegen aber vermutlich in der Controls Liste der GroupBoxen.

Du müßtest dich also rekursiv durch den Baum der Controls arbeiten um auch wirklich alle CheckBoxen zu finden. Deutlich einfacher wäre es eine CheckedListBox zu benutzen und ein leicht anderes UI Design. Das wäre insbesondere einfacher zu erweitern/ändern wenn sich die Liste der betroffenen Server ändert. Un ddu wirst mir bestimmt nicht garantieren das sich die nie ändert.

Um rekursiv an alle CheckBoxen zu kommen hilft dir folgende Extensionmethod

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    public static class ExtensionMethods
    {
        public static IEnumerable<T> AllOfType<T>(this Control control) where T : Control
        {
            if (control is T)
                yield return (control as T);

            foreach (Control child in control.Controls)
                foreach (var ret in child.AllOfType<T>())
                    yield return ret;
        }        
    }


danach entsprechend deine Schleife anpassen
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
foreach (var item in this.AllOfType<CheckBox>())

    if(item.Checked) // <- item nicht checkBoxIrgendwas
    {
         Statuslbl1.Text = "Überprüfe Boxen";
         // Angehakt 
         // ........ u.s.w.
    }
}

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 11:09 
Ui jui jui ! Vielen Dank für die Antworten,

ich werde sofort mal versuchen, das ganze mal wie oben beschrieben umzusetzen bzw zu probieren.

Eine andere frage:

Wie würde es denn laufen, wenn ich wirklich die Form noch mal neu mache und mit einer CheckedListBox arbeite ?
Habe extra nur die Simplen CheckBoxen genommen da ich mit mit den Listen nicht wirklich auskenne o:

Gruß
Lihlu
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.02.14 11:39 
CheckedListBox hat eine Item Property die du mit den Namen der Servern befüllen kannst (Im Code oder im Designer) und bei deinem Click auf Scan kannst du die CheckedItems Property auslesen die eine Liste der gecheckten Elemente zurückgibt. Brauchst dann also auch nicht mehr selber prüfen wer gecheckt ist und wer nicht.

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 12:23 
Ich glaube ich bin zum Programmieren nicht geschaffen :/

Ich probiere gerade echt einmal den anderen Weg mit der CheckedListBox aus. Doch irgendwie schaffe ich es einfach nicht die Markierten Namen in eine Listbox zu übertragen ... :/

Nach mehrfachen googeln hab ich einige Version gefunden, die mich aber auch nicht recht zu frieden gestellt haben :/

Mag mir wir eben verraten wie ich aus einer CheckedListBox nur die Markierten Namen in eine ListBox übertragen kann :/

Ich muss ja irgendwie die Namen auslesen damit ich sie in den Ping abschnitt einfügen kann.

Gruß
Lihlu
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.02.14 12:38 
Die Winforms Controls stammen leider aus einer Zeit wo es keine Generics gab. Da wird/wurde leider noch oft mit unhandlichen Collections gearbeitet darum ist der Kunstgriff mit OfType und ToArray nötig wenn man das ~direkt~ machen will.

ausblenden C#-Quelltext
1:
deineLiebeListBox.Items.AddRange(deineLiebeCheckedListBox.CheckedItems.OfType<string>().ToArray());					


Darum ist ein simple Schleife vorzuziehen.

ausblenden C#-Quelltext
1:
2:
foreach (var item in checkedListBox1.CheckedItems)
     listBox1.Items.Add(item);

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 25.02.14 13:49 
Mahlzeit :p

also es sieht eig momentan recht "okey" aus :P

Das Bild der GUI habe ich als Anhang beigefügt.

Was kappt nun:
Das Kästchen was ich momentan an hake funktioniert einwandfrei. Ich bekomme angezeigt ob ein Ping erfolgreich war oder nicht.

Nur möchte ich das er alle angehakten nach einander durchgeht und nicht nur das jetzige markierte.

Ich habe es bereits mir Ralf (wenn ich Ralf sagen darf :p)foreach- item schleife probiert aber irgendwie ging das auch nicht :/

Der Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void startbtn_Click(object sender, EventArgs e)
        {
            try
             {
           
            Ping Sender = new Ping();
            PingReply Result = Sender.Send(ServerBox.Text);
            if (Result.Status == IPStatus.Success)
                statuslistok.Items.Add(ServerBox.Text+" OK");
         
            else
                statuslisterror.Items.Add(" Error 1");//Error Box
            }
                catch
            {
                statuslisterror.Items.Add(ServerBox.Text+" Ping Error 2");//Error Box
             }

        }


So ganz versteh ich selber nicht wie es funktionieren kann, da ServerBox.Text doch eig nur der Name der CheckListBox ist o:
Aber es funktioniert :P
Nur leider noch nicht mit allen markierten sondern nur mit dem derzeitig angeklickten o.o

Könnt ihr mir hier noch ein letztes mal weiter helfen o:

Gruß
Lihlu
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.02.14 15:26 
Zitat:
wenn ich Ralf sagen darf


Das wär mir lieber als jeder andere Vorname ;)


Alle Controls haben eine Text Property ob die Sinn macht oder nicht. Darin befindet sich nicht der Name Controls, die haben ja bereits eine Name Property würde also auch wenig Sinn machen.
Bei einer ListBox steht in Text das fokusierte Element du bekomst also irgendein Element jenach dem an welchem du zuletzt geschraubt hast.

Wenn du alle Element in der LIstbox benutzen willst dann brauchst du wieder ein eine Schleife um die Items dieser ListBox. Wie das geht siehst du eigentlich schon im letzten Beitrag. Du mußt halt nicht CheckItems nehmen sondern bei einer normalen ListBox halt Items. Diese kleiner Transferleistung solltest du eigentlich leicht selbst hinbekommen.

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Mi 26.02.14 11:43 
Guten Morgen :p

hat nun alles so geklappt wie es sollte :D

Danke noch mal an alle!

Gruß
Lihlu

Ich hänge von der Endversion noch mal ein Bild an :p
Einloggen, um Attachments anzusehen!