Laden...

C# updated den Inhalt einer ComboBox nicht wenn die Item Sammlung gefüllt ist

Erstellt von Harry2001 vor 3 Jahren Letzter Beitrag vor 3 Jahren 2.199 Views
H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren
C# updated den Inhalt einer ComboBox nicht wenn die Item Sammlung gefüllt ist

Hallo zusammen,

ich habe eine Funktion die zuerst alle auf der Form vorhandenen Comboboxen auf Text = "" setzt und dann den Text einzelner Comboboxen setzt. Dies funktioniert auch problemlos. Jedoch wenn ich die ComboBoxen mit Items fülle dann setzt er danach den Text nicht mehr.

Ich habe das Projekt auf meiner Dropbox und alle nicht benötigten Funktionen entfernt.
// Link von Abt entfernt

Zum Test einfach Starten, auf den Reiter "Werkzeuganfrage" wechseln und hier sind zwei rot hinterlegte Comboboxen. Einmal eine ohne Items die beschrieben wird und einmal eine mit Items die nicht funktioniert.

Hat jemand eine Idee warum???

Ich habe dies sonst in Projekten verwendet und es hat immer funktioniert nur hier nicht.

Danke für eure Hilfe

16.806 Beiträge seit 2008
vor 3 Jahren

Ein Forum funktioniert so, dass Beiträge langfristig auch für andere Besucher sichtbar sind.
Wenn Du ein Projekt extern, zB auf Dropbox hochlädst, dann ist es sehr wahrscheinlich, dass der entsprechende Link früher weg ist als das Thema - und somit das Thema hinfällig wird.
Daher gestatten wir externe Links nicht.

Poste bitte gemäß [Hinweis] Wie poste ich richtig? den relevanten Code direkt in die Editor-Code-Tags.
Danke.

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Sorry, hab das mit dem nicht das Projekt posten jetzt zwar gelesen aber ja ... ist denke ich nur mit einem Codeschnipsel recht schwierig. Denoch hier der Code + Screenshots


namespace Digitales_Auftragsformular
{

    public partial class Oberflaeche : Form
    {
        public Oberflaeche()
        {
            InitializeComponent();           

            
            List<ComboBox> myComboBoxes = GetControlsByType<ComboBox>(this, typeof(ComboBox));
                                    
            foreach (ComboBox txt in myComboBoxes)
            {
                txt.Text = "";

            }
            Werkzeuganfrage_Combobox_rhino1_1.Text = "Rhino1_1";
            Werkzeuganfrage_Combobox_rhino1_2.Text = "Rhino1_2";
        }



        public List<T> GetControlsByType<T>(Control container, Type type)
        {


            List<T> result = new List<T>();
            foreach (Control c in container.Controls)
            {
                if (c.GetType() == type)
                {
                    result.Add((T)Convert.ChangeType(c, typeof(T)));
                }

                if (c.HasChildren)
                {
                    result.AddRange(GetControlsByType<T>(c, type));
                }
            }
            return result;
        }


    }
} 
16.806 Beiträge seit 2008
vor 3 Jahren

Das hört sich ja nach einem Problem an - und es sieht danach aus - dass irgendwas bei den entsprechenden Schritten nicht stimmt.
Hast Du mal die einzelnen stellen gedebuggt um zu schauen, wann wo was wie passiert - und ob es so passiert wie Du denkst?

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Im Code von GetControlsByType kannst Du mit dem generischen Typ arbeiten.
Ändert das Verhalten nun nicht, nur ein Tipp wie Du den generischen Typ innerhalb der Methode richtig verwenden kannst.

public List<TTargetControl> GetControlsByType<TTargetControl>(Control container)
{
    List<TTargetControl> result = new List<TTargetControl>();
    foreach (Control c in container.Controls)
    {
        var t = c as TTargetControl;
        if (t != null)
        {
            result.Add(t);
        }

        if (c.HasChildren)
        {
            result.AddRange(GetControlsByType<TTargetControl>(c));
        }
    }
    return result;
}

Edit: Korrektur von Th69 übernommen.

4.931 Beiträge seit 2008
vor 3 Jahren

Hallo,

sind denn die TextBoxen in beiden ComboBoxen editierbar, s. DropDownStyle? Bei DropDownList können nur Werte aus der Liste in der TextBox angezeigt werden.

PS: Abt, im Code von dir ist noch ein kleiner Fehler:


if (c is TTargetControl)

Aber auf das Convert.ChangeType kann auch komplett verzichtet werden:


var t = c as TTargetControl;
if (t != null)
{
    result.Add(t);
}

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hallo,

ja sind beide auf Dropdownstyle = "DropDown".

Sonst Ideen?

Danke für den Hinweis.

B
22 Beiträge seit 2018
vor 3 Jahren

Hallo Harry2001,

ich habe in einem kleinen Testprojekt deinen Code ausgeführt und bei mir funktioniert alles wie gewünscht. Die Eigenschaften der ComboBoxen habe ich unverändert gelassen bis darauf das ich Items hinzugefügt habe. Eventuell hast du einen Codeschnipsel hier beim Posten entfernt der diesen Fehler verursacht.

Hier musst du wie es Abt geschrieben hat wohl mal den Debugger anwerfen 😉

Grüße

Brymax

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hallo Brymax,

danke für deine Info.
Ich bin der selben Meinung bei mir funktioniert der Code normalerweise auch nur in dem speziellen Fall dieses Projekts (das ich auf die Dropbox geladen habe) funktioniert es eben nicht.

Ich habe auch komplett neue Comboboxen ohne Eigenschaftsveränderung eingefügt und das selbe. Sobald ich Items einfüge kommt kein Text mehr.

Ich habe auch im Debugger schon alles mögliche versucht aber ich komme leider auf keinen grünen Zweig.
Ich verstehe, dass das mit dem gesamten Projekt hochladen nicht erwünscht ist, aber da es nicht an dem Codeschnipsel sondern an irgendeinem anderen Teil liegen muss (keine Ahnung was man hier sonst noch falsch machen kann) wäre ich froh wenn jemand das Dropbox Projekt mal kurz probieren könnte.

Danke,
Gruß Harry

16.806 Beiträge seit 2008
vor 3 Jahren

Dann lad ausnahmsweise das Projekt als Zip als Anhang hoch und verlinke bitte NICHT auf externe Quellen wie Dropbox.
Wie es auch in [Hinweis] Wie poste ich richtig? steht.

Ob dann jemand für Dich die Debug-Arbeit übernimmt ist dann quasi Freiheit des potentiellen Helfers.

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hallo Abt,

das hätte ich gerne gemacht, wollte ich auch ursprünglich, leider ist der Upload auf 256 KB begrenzt.
Darum habe ich die Dropbox-Variante gewählt.

// Link von Abt entfernt

Gruß Harald

B
22 Beiträge seit 2018
vor 3 Jahren

Ach Mensch Harry2001. Der Link wird doch wieder entfernt 🤔 Es ist ausdrücklich untersagt Links auf externe Filehoster zu posten.

Option wäre noch das du deine Oberflaeche.cs Datei einzeln hochlädst. Ich denke der Großteil deiner Logik wird hier drin sein. Und damit diese die 256kb übersteigt muss diese schon mehrere 1000 Zeilen Code haben.

16.806 Beiträge seit 2008
vor 3 Jahren

Leg nur das Projekt mit den CS Dateien in die Zip.
Enfterne bin/obj Ordner; die werden der Grund für die Größe sein.

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hey Brymax,

die Oberflaeche.cs ist bereits der komplette gepostete Teil.
Es muss etwas am Designer sein ...

Jetzt habe ich das komplette Projekt ohne die Ordner bin bzw. obj gezippt und angehängt.

Vielleicht klappt das.

Danke!!!!

4.931 Beiträge seit 2008
vor 3 Jahren

So ich habe mir mal dein Projekt angeschaut.
Warum hast du FormattingEnabled bei den ComboBoxen auf true gesetzt?

Aber ein ganz dringender Rat, bevor du weiter an dem Projekt arbeitest:
Du hast bisher die gesamte UI in einer Form hinterlegt (die "Oberflaeche.Designer.cs" ist bisher 870KB groß!), und dann noch willkürlich die enthaltenen Steuerelemente benannt (bzw. es so belassen, wie der Designer sie erstellt hat, d.h. mit Zahlensuffix) -> so wird keiner (auch du nicht) sich dadrin zurecht finden.
Unterteile deine Controls (zumindestens jede einzelne TabPage, aber auch dadrin enthaltene zusammengehörige Elemente) in einzelne UserControls, welche du dann gesondert ausprogrammieren kannst (anstatt dann den gesamten Code in einer Form-Klasse zu haben)!

Dein Programm ist jetzt schon unbedienbar (es dauert Sekunden, um zwischen den Tabs zu wechseln!), wie soll das erst sein, wenn noch Logik und Daten hinzukommen?
Für die Anzeige der zeilenartigen Auswahl z.B. solltest du passende Listen bzw. Grid-Controls verwenden (anstatt individuelle Elemente). Du willst sie intern doch sicherlich als Liste (bzw. Array) ansprechen (insb. bei Verwendung von DataBinding).

Hast du denn keinen Projektbetreuer?

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hallo Th69,

also erstmal danke für den Aufwand mit meinem Projekt!

Dann zu deinen Themen:
*Formattingenabled war glaub nur ein Test, kann ich auf false setzen
*UI, ich gebe zu es war mein erster Test mit C# und ja hat bisher so gut funktioniert das ich immer weiter gemacht habe - bis auf das Problem jetzt --> dennoch werde ich mir das Thema mit den UserControls ansehen!
* nein hab das ganze selbst gemacht und läuft bis dato bei 30 Mitarbeitern sehr stabil

Konntest du mein Problem mit den Comboboxen bei dir nachvollziehen?

4.931 Beiträge seit 2008
vor 3 Jahren

Ja, an deinem lauffähigen Programm konnte ich es nachvollziehen (ich werde es aber nicht bei mir im VS laufen lassen!).

Kannst du mal bei dir überprüfen, ob es auch passiert, wenn du vorher das Setzen auf "" nicht durchführst (also die vorherige Schleife auskommentierst)?

Edit: Habe es gerade an einem eigenen Testprogramm nachvollziehen können.
Sobald der Text auf eine der enthaltenen Items-Einträge gesetzt wird, kann dieser nicht mehr auf einen anderen, nicht enthaltenen, Text geändert werden (bei dir ist der Leerstring in der Auswahl).
Abhilfe schafft man mittels Zurücksetzen des SelectedIndex-Wertes:


comboBox.SelectedIndex = -1;
comboBox.Text = "Neuer Text";

B
22 Beiträge seit 2018
vor 3 Jahren

Also ich habe jetzt mit einem Testprojekt exakt den selben Aufbau der Comboxen vorgenommen mit den exakt selben Eigenschaften wie du. Ergebnis mit und ohne FormattingEnabled ist das es funktioniert. Auch wenn ich vorher alles auf "" setze.

4.931 Beiträge seit 2008
vor 3 Jahren

Ups, da haben wir gleichzeitig gepostet (ich habe oben noch mal ein "Edit" hinzugefügt 😉.

PS: Habe auch rausgefunden, daß obwohl der Standardwert von FormattingEnabled gleich false ist, der Designer beim Einfügen einer ComboBox diesen automatisch auf true setzt (warum auch immer?) - daher war ich bei deinem Code irritiert.

B
22 Beiträge seit 2018
vor 3 Jahren

@Th69

Das mit dem FormattingEnabled ist mir auch aufgefallen hatte es vorhin vergessen zu schreiben 🙂

H
Harry2001 Themenstarter:in
8 Beiträge seit 2020
vor 3 Jahren

Hallo zusammen,

also die Lösung war, wie von Th69 empfohlen, den SelectedIndex auf -1 zu setzen anstelle von Text = ""

Jetzt funktionierts wieder problemlos!!!

Nunmuss ich nur noch alle anderen Tipps einarbeiten 😉

Vielen Dank für eure Hilfe!