Hi Leute,
ich habe ein kleines Programm geschrieben, in dem insgesamt 34 comboboxen sind.
Nun möchte ich, die Anzahl aller Comboboxen, die gesetzt sind herausfinden und in eine vorhandene Datei schreiben.
Das Schreiben krieg ich hin aber wie kann ich herausfinden wieviele Comboboxen gesetzt sind. Muss ja nicht wissen welche von denen nur wieviele
Hoffe mir kann einer helfen
Danke im voraus
Zecken81
Hallo
durchlaufe die Eigenschaft "Control" des Parentelementes in dem sich die Comboboxen befinden und überprüfe über die SelectIndex-Eigenschaft der jeweiligen Combobox ob diese selektiert wurden..
Gruß Olli
Hallo zecken81,
Anzahl aktiver ComboBoxen ermitteln
aktiv ist immer nur eine 🙂
Meinst du vielleicht CheckBoxen?
Ansonsten hat ja Unikum schon den richtigen Weg aufgezeigt.
Versteh ich nicht tut mir leid, Bin noch relativ neu mit c#
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Die Grundlagen, um solche Antworten zu verstehen, erwarten wir schon.
herbivore
nein meine ComboBoxen bei einer Anzahl von 34 stück insgesamt.
Es geht hier um Zähne und Zahnersatz
Der Kunde entscheidet welcher Zahn ersetzt werden soll
Sind es z.B. die von 11- 13 oder von 23-27 und genau die Anzahl brauch ich
Alternativ könnte man auch die Anzahl der Zeilen au der erstellten txt datei auslesen und diese dann als Anzahl der Verosgungen angeben dann müsste man nicht die comboboxen prüfen
if (comboBox2.SelectedItem != null) {
int i = 1;
schreiben.WriteLine("Anzahl der Versorgungen:" + i);
}
Das ist für eine einzige ComboBox jetzt habe ich noch 32 andere davon und das ist mein problem.
Es gibt ja unendlich viele möglichkeiten dann. Er kann ja combobox2 und combobox 23 wählen dann muss 2 rauskommen.
Hallo zecken81,
eine dafür Lösung hat Unikum schon gepostet.
Siehe auch [FAQ] Variablennamen zur Laufzeit zusammensetzen
herbivore
Vielleicht hilft dir eine Ergänzung zum Betrag von Unikum auf die Sprünge:
Wenn du dich gerade Code deiner Form befindest erhälts du mit this.Controls eine Collection mit allen Controls zurück, die direkt auf der Form liegen (das heisst, jedes Control ist in der Collection des "parentelemtens" Form <- GroupBox <- TextBox )
Diese Collection kannst du z.B. mit einer foreach() Schleife durchrennen. Fuer jedes Control in der Collection prüfst du, ob es vom typ ComboBox ist. Ist das der Fall, castest du es in eine ComboBox und prüfst ob ein Item der ComboBox augewählt ist:
Pseudo:
foreach(controls in Collection) {
if(controls == typ ComboBox) {
tempBox = controls
if(tempBox.Selected...) {
machwas;
}
}
}
Das wäre halt mein Vorschlag (gewesen).
Danke für die Antworten habe trotzdem nicht hinbekommen 🙂
Hab jetzt einfach eine neue Combobox eingeführt, und der Kunde soll dann halt händisch eingeben, wie groß die Anzahl ist.
Hallo zecken81,
sorry, aber das ist doch Mist. Du kannst doch den Kunden deinen Unvermögen ausbaden lassen. Mal abgesehen dass er dabei ja leicht Fehleingaben machen kann, und was dann?
herbivore
Wobei ich noch mehr mist finde, dass ein Programmieranfänger eine anscheinend wichtige Software schreibt 🙂
> Codejunky <
Hallo zecken81,
Sollstest dir wirklich erstma die Grundlagen aneignen und wie herbivore schon gesagt hat, sollten solche Sachen nie von einem Kunden ausgebadet werden müssen.
Hab mir jetzt trotzdem kurz die Zeit genommen:
int wievielZähne = 0;
foreach (Control tempCtrl in this.Controls)
{
if (tempCtrl.GetType() == typeof(ComboBox))
{
wievielZähne++;
}
}
schreiben.WriteLine("Anzahl der Versorgungen:" + wievielZähne);
Sollte eig. bei dir auch gleich funktionieren...
Mit freundlichen Grüssen
Tobias
@TmikeB
Damit zählst Du nur die anzahl der Comoboxen, die auf einer Form sind (32, wissen wir ja , müssen wir nich zählen). Das wird einem
if (comboBox2.SelectedItem != null) {
int i = 1;
schreiben.WriteLine("Anzahl der Versorgungen:" + i);
}
in keinster weise gerecht.
Na und muss ja nur das:
if (((ComboBox)tempCtrl).SelectedItem != null) {
//int i = 1; Daraus eine member-variable machen und hier mit i++ hochzählen, dann am Ende der Schleife eine Ausgabe machen
schreiben.WriteLine("Anzahl der Versorgungen:" + i);
}
in die Schleife
Ihr habt hier ne merkwürdige Art halbwahrheiten als Lösung anzupreisen
Na und 😉 wenn er bisher das hier:
if (comboBox2.SelectedItem != null) {
int i = 1;
schreiben.WriteLine("Anzahl der Versorgungen:" + i);
}
für jede ComboBox getan hat dann wird das hier:
int wievielZähne = 0;
foreach (Control tempCtrl in this.Controls)
{
if (tempCtrl is ComboBox)
{
if (((ComboBox)tempCtrl).SelectedItem != null)
{
wievielZähne++;
}
}
}
schreiben.WriteLine("Anzahl der Versorgungen:" + wievielZähne);
doch zum gewünschten effekt/erfolg führen. Kann darin jetzt keine Halbwahrheit erkennen.
Schau Dir den Post an auf den sich das anfangs bezog und denk dann in ruhe, für Dich alleine noch mal drüber nach. Ich sehe keine Grundlage eine Diskussion darüber (in diesem Thread) zu führen, dafür scheint mir die Vorgehensweise hier viel zu verbreitet zu sein. (Und wenn es doch Diskutiert werden soll, dann bitte in einem OT bereich, die Diskussion wird länger (und ohne Ergebnis) sein.)
Geb ich dir Recht und Diskussionen gab es schon genug darüber. Aber immerhin steht alles da was er braucht.
Werte Gemeinde,
leider muss ich dieses alte Thema wieder ausgraben...
Ich möchte in einem Projekt die Anzahl aller Comboboxen mit dem Wert größer 0 ermitteln und bin nun auf diesen Lösungsansatz gestoßen, jedoch ohne Erfolg.
Könnt Ihr mir sagen was ich übersehe?
In meiner Form existiert eine vielzahl an Comboboxen, welche mit Zahlen zu füllen sind.
Als Standard steht immer eine 0 drin. Ich habe einen Button in der Form erstellt, welcher die Funktion berechne() startet. In diesere Funktion möchte ich erstmal die Anzahl aller Boxen >0 ermitteln, um damit anschließend weiter zu rechen. Egal was ich anstelle, es wird immer die Zahl 0 ausgegeben.
Der Code ist nahezu identisch zu obigem Post, die Textbox ist nur zu Testzwecken eingebaut.
private void berechne()
{
//lokale Variablen deklarieren
int wievieleboxen = 0;
foreach (Control tempCtrl in this.Controls)
{
if (tempCtrl is ComboBox)
{
if (((ComboBox)tempCtrl).SelectedItem != null)
{
wievieleboxen++;
}
}
}
txtboxen.Text = Convert.ToString(wievieleboxen);
}
Danke für Eure Unterstützung!
Ich denke mal, dass du zusätzliche Container in deiner Form hast. Doku lesen hilft.
https://msdn.microsoft.com/de-de/library/system.windows.forms.control.controls(v=vs.110).aspx
Ungetestet:
public IEnumerable<Control> GetAll(Control control)
{
var controls = control.Controls.OfType<Control>();
return controls.SelectMany(GetAll).Concat(controls).Where(c => c is ComboBox && ((ComboBox)c).SelectedItem != null);
}
(einfach rekursiv durchsuchen)
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Leider spuckt der Debugger nichts aus.
Mir scheint es so, als würde die Funktion "nicht" Arbeiten.
Wenn ich sie im Debugger Schritt für Schritt durchgehe, ändert sich er Wert für "wievieleboxen" nicht.
Ändere ich ihn manuell ab, bleibt der neue Wert bestehen und wird ausgegeben.
Wenn ich sie im Debugger Schritt für Schritt durchgehe, ändert sich er Wert für "wievieleboxen" nicht.
Dann siehst du doch im Debugger, warum sie sich nicht ändert, oder nicht? 🤔 Eine deiner If-Klauseln wird wohl false sein...
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Noch einmal: die Property Controls liefert nur alle DIREKTEN Kind-Controls. Wenn da noch eine GroupBox oder dergleichen drin is, in der du deine Combos gruppiert hast, dann wird das so nix. Also durchiterieren, wie oben geschrieben.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Noch einmal: die Property Controls liefert nur alle DIREKTEN Kind-Controls. Wenn da noch eine GroupBox oder dergleichen drin is, in der du deine Combos gruppiert hast, dann wird das so nix. Also durchiterieren, wie oben geschrieben.
Und das wiederum sieht er dann auch im Debugger, wenn z.B. in der Controls-Collection nur eine GroupBox o.ä. drin ist und dann natürlich die Bedingung nicht greift...
Ja, DU siehst das, und ich auch, aber bei so einer Frage darfst du davon ausgehen, dass er mit dem Debugger inhaltlich nicht gut genug umgehen kann. (Seh grad, bist du ja auch, der Link ist ja schon gepostet 😁 )
LaTino
Im übrigen, wenn ich schon "Vielzahl von Comboboxen" lese, noch 'n Kauftipp:
http://www.amazon.de/User-Interface-Design-Programmers-Spolsky/dp/1893115941
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
In [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls stehen auch noch zusätzliche Tipps, wie man Controls zur Laufzeit (erzeugt und) anspricht.
Und wenn man vernünftig mit DataBinding arbeitet ( ja, das geht auch in WindowsForms ) muss man hier überhaupt nichts mit den Controls machen.