Autor |
Beitrag |
Lihlu
Beiträge: 53
|
Verfasst: 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:
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 Christian S.: C#-Tags hinzugefügt
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Beiträge: 53
|
Verfasst: 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:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (CheckBox.Checked) { PING sneden } else { Ping nicht senden } |
EDIT: Der Scan Button o:
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";
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";
} } else { 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 Christian S.: Bild bei uns hochgeladen
Einloggen, um Attachments anzusehen!
|
|
Yankyy02
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: Di 25.02.14 10:05
Hallo Lihlu,
du könntest mittels einer foreach Schleife über die Controls iterieren ...
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
Beiträge: 53
|
Verfasst: 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.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
Beiträge: 53
|
Verfasst: 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
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.
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:
| private void button1_Click(object sender, EventArgs e) {
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) { Statuslbl1.Text = "Überprüfe Boxen";
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";
} } else { Statuslbl.Text = "ERROR"; Statuslbl7.Text = "Status: Wähle einen Server aus und Hake ihn an!"; }
} } |
Gruß
Lihlu
|
|
Yankyy02
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: 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
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) { chkControl = item; if(chkControl.IsChecked) { } } } |
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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
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
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| foreach (var item in this.AllOfType<CheckBox>()) { if(item.Checked) { Statuslbl1.Text = "Überprüfe Boxen"; } } |
Für diesen Beitrag haben gedankt: Lihlu
|
|
Lihlu
Beiträge: 53
|
Verfasst: 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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 53
|
Verfasst: 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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 25.02.14 12:38
Für diesen Beitrag haben gedankt: Lihlu
|
|
Lihlu
Beiträge: 53
|
Verfasst: Di 25.02.14 13:49
Mahlzeit :p
also es sieht eig momentan recht "okey" aus
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:
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"); } catch { statuslisterror.Items.Add(ServerBox.Text+" Ping Error 2"); }
} |
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
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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 53
|
Verfasst: Mi 26.02.14 11:43
Guten Morgen :p
hat nun alles so geklappt wie es sollte
Danke noch mal an alle!
Gruß
Lihlu
Ich hänge von der Endversion noch mal ein Bild an :p
Einloggen, um Attachments anzusehen!
|
|