Laden...

[gelöst] Anzahl aktiver ComboBoxen ermitteln

Erstellt von zecken81 vor 15 Jahren Letzter Beitrag vor 8 Jahren 4.456 Views
Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren
[gelöst] Anzahl aktiver ComboBoxen ermitteln

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

U
228 Beiträge seit 2004
vor 15 Jahren

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

Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

Versteh ich nicht tut mir leid

Bin noch relativ neu mit c#

49.485 Beiträge seit 2005
vor 15 Jahren

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

Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

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

Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

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

195 Beiträge seit 2006
vor 15 Jahren

SelectedItems? evtl. selectedItems.count

Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren
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.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zecken81,

eine dafür Lösung hat Unikum schon gepostet.

Siehe auch [FAQ] Variablennamen zur Laufzeit zusammensetzen

herbivore

38 Beiträge seit 2006
vor 15 Jahren

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).

Z
zecken81 Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

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.

49.485 Beiträge seit 2005
vor 15 Jahren

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

1.665 Beiträge seit 2006
vor 15 Jahren

Wobei ich noch mehr mist finde, dass ein Programmieranfänger eine anscheinend wichtige Software schreibt 🙂

T
177 Beiträge seit 2007
vor 15 Jahren

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

123 Beiträge seit 2008
vor 15 Jahren

@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.

2.760 Beiträge seit 2006
vor 15 Jahren

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

123 Beiträge seit 2008
vor 15 Jahren

Ihr habt hier ne merkwürdige Art halbwahrheiten als Lösung anzupreisen

2.760 Beiträge seit 2006
vor 15 Jahren

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.

123 Beiträge seit 2008
vor 15 Jahren

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.)

2.760 Beiträge seit 2006
vor 15 Jahren

Geb ich dir Recht und Diskussionen gab es schon genug darüber. Aber immerhin steht alles da was er braucht.

6 Beiträge seit 2012
vor 8 Jahren

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!

1.040 Beiträge seit 2007
vor 8 Jahren
3.003 Beiträge seit 2006
vor 8 Jahren

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)

6 Beiträge seit 2012
vor 8 Jahren

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.

2.207 Beiträge seit 2011
vor 8 Jahren

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...

3.003 Beiträge seit 2006
vor 8 Jahren

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)

1.040 Beiträge seit 2007
vor 8 Jahren

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...

3.003 Beiträge seit 2006
vor 8 Jahren

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)

771 Beiträge seit 2009
vor 8 Jahren

In [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls stehen auch noch zusätzliche Tipps, wie man Controls zur Laufzeit (erzeugt und) anspricht.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Und wenn man vernünftig mit DataBinding arbeitet ( ja, das geht auch in WindowsForms ) muss man hier überhaupt nichts mit den Controls machen.