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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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;
}
}
}
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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);
}
Hallo,
ja sind beide auf Dropdownstyle = "DropDown".
Sonst Ideen?
Danke für den Hinweis.
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
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!!!!
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?
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?
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";
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
@Th69
Das mit dem FormattingEnabled ist mir auch aufgefallen hatte es vorhin vergessen zu schreiben 🙂
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!