none
ComboBox Höhe / Funktionalität / Design ändern

    Frage

  • Hallo Gemeinde,

    Umgebung: VB 2012, Windows Forms, Desktop Applikation. Ich kämpfe mit einer  Kleinigkeit, die wegen zahlloser Trial- and Error Versuche bereits Unmengen an Entwickler-Zeit konsumiert hat, ohne dass es bislang ein akzeptables Ergebnis gibt.

    Die Applikation erwartet die Eingabe einer Zeitperiode in der Form Anzahl Zeiteinheiten + eine von 3 Zeiteinheiten Tag, Monat oder Jahr, z.B. 3 Jahre, 14 Tage oder 6 Monate. Für die Anzahl der Zeiteinheiten wird ein NumericUpDown und für die Einheiten eine Combobox. Die Daten befinden sich auf einem komplexen Formular, auf dem die Controls in einem TableLayoutPanel angeordnet sind, damit ein Resize möglich ist.

    Die Combobox ist eine echte Wucht: die Properties DropDownStyle, FlatStyle und Size (zumindest Height) hängen auf eine völlig idiotische Weise von einander ab und machen die Control somit ziemlich unbrauchbar, ohne dass es eine funktionale Alternative gäbe, vor allem ohne dass sich mir auch nur im Geringsten der Sinn dieser Abhängigkeiten erschließt.

    Wenn DropDownStyle auf Simple gesetzt wird, kann die Höhe der Combobox beliebig verändert werden, nur steht dann die benötigte Funktionalität, nämlich den Benutzer aus einer vordefinierten Menge von Möglichkeiten eine auswählen zu lassen, nicht zur Verfügung. Es bleibt also nur der Wert DropDownList, und damit sind die Design-Möglichkeiten dahin, die Höhe ändert sich mit der Font-Größe.

    Dabei wird jedoch um den Textteil soviel Platz verschwendet, dass man auf eine inakzeptabel kleine Schrifthöhe gehen muss, um auf die selbe Höhe wie bei den umgebenden TextBoxen zu kommen  (TextBox mit Font "Segoe UI" mit 9,75 pt hat Höhe 15 pt, bei gleichem Font ist die Höhe der Combobox 25 pt und verdeckt damit 3/4 der nächsten Zeile. Der Font der Combobox muss auf 4,1 pt reduziert werden, damit sie die Höhe 14 pt erhält, 15 geht nicht, bei 4,15 pt ist die Höhe 16 pt. Wie lesbar 4,1 pt Schriftgröße ist, braucht man nicht erläutern...).

    Außerdem, wenn der Dock-Style Fill verwendet wird, damit sich die Größe der Combobox an die Größe der Zelle des TLP anpasst, wird die Combobox breiter als die Zelle des TLP gemacht, in der es sich befindet.

    Kennt jemand eine Möglichkeit, wie man eine Combobox mit FlatStyle = Flat, DropDownStyle  = DropDownList, Font = "Segoe UI" 9,75pt  und Höhe = 15 pt erzeugen kann?

    Oder gibt es - außer das ganze als UserControl komplett neu zu entwickeln - eine andere Option, die ich nicht kenne? Und zuletzt: ist dieses dämliche Verhalten ein Bug und kann man erwarten, dass das repariert wird oder sollte man darauf nicht hoffen? Danke schon für eure Antworten!

    LG Peter

    Dienstag, 9. April 2013 15:06

Antworten

Alle Antworten

  • Hallo Peter,

    Die "FlatStyle" Combobox unterscheidet sich wesentlich von der "Standard" Variante:
    Sie wird von Windows Forms selbst gezeichnet. Man durchaus seine eigene Variante entwerfen - wie FlatStyle tut, in dem man die WM_PAINT Nachricht selbst behandelt.

    Die Standard-Variante wird von Windows gezeichnet wird und sich im Aussehen den Versionen an - und übernimmt die Einstellungen, was ihre räumlichen Maße angeht - wobei die Zeichengröße der bestimmende Faktor ist.

    Daraus ergibt sich auch eine Höhen-Differenz zur Textbox uam., die der Designer durch Hinweise auszugleichen anbietet - macht man es mit Code muss man das selbst anpassen.

    Simple ist weniger eine Combobox als mehr eine TextBox.

    Abseits davon dass sich meiner Erfahrung gegen die Windows Standards zu stellen oft mehr Ärger mit sich bringt als auf Dauer lohnt ;) sollte man sich die Frage stellen:

    Will man seine Formulare anders aussehen lassen als Windows es vorsieht?
    Auch sollte man nicht zu sehr auf "optimale Platzausnutzung" schielen; das finden Anwender, die später ihre Augen den ganzen Tag darauf richten müssen, oft als anstrengend.

    Gruß Elmar

    Dienstag, 9. April 2013 17:39
  • Hallo Elmar,

    danke wieder einmal für deine schnelle Reaktion. Ein paar Teile sind  aus deinem Text abhanden gekommen, daher verstehe ich nicht wirklich alles.

    Ich will weder gegen Windows Standards programmieren, noch irgendwelche schon lange bekannten Räder selbst neu erfinden; wie du richtig sagst, ist damit der Ärger vorprogrammiert. Genau deshalb habe ich ja hier die Frage gestellt, damit mir eventuell ein Guru sagt, wie ich das Ergebnis erzielen kann, das ich brauche.

    Ich muss mit folgenden Randbedingungen auskommen: 1. ich muss die Design-Vorgaben einhalten (Eingabefelder als rahmenlose helle Flächen in dunklen Hintergrund eingebettet und wegen der Ästhetik bitte gleich groß und mit gleichem Font) und 2. ich muss die Funktionalität bereitstellen (= DropDownList zur Auswahl eines Wertes).

    Warum meint Windows, dass wenn Style Flat eingestellt ist, ich die Größe nicht ändern darf? Sollte das nicht meine Entscheidung als Designer/Entwickler sein? Ich sehe darin nichts, was gegen Windows Standards verstoßen würde, weil alle Properties sind ja gegeben und einstellbar, bloß dass die Combobox in einem Anfall von Größenwahn meint, sich ins Design einmischen zu dürfen... ;-)

    Wenn du bitte vielleicht noch die fehlenden Textstellen nachreichen könntest...

    LG Peter

    PS: Ich habe zur besseren Illustration des Problems einen Screenshot angefügt. Wie du siehst, müsste man die beiden letzten Zeilen im oberen Datenblock viel größer machen, damit die Abstände von den darüber liegenden Feldern identisch sind.

     

    Dienstag, 9. April 2013 19:26
  • Hallo Peter,

    die Höhe der ComboBox - flach oder nicht - richtet sich nach der Fonthöhe plus des Rahmens / DropDowns. Daran ändern kann man nur etwas, wenn man eine eigene Ableitung erstellt. Reduziert man jedoch die Rand-Zugaben, sieht es schnell gequetscht aus.

    Eine gleiche Höhe ist auch bei den anderen Steuerelementen nicht gegeben, siehe Label vs. TextBox usw. Auch dort gilt primär die Schriftgröße als Maßstab, hinzu kommen die Verzierungen wie Rahmen. Ein optischer Ausgleich kann nur annähernd übe die Positionierung erfolgen.

    Wenn man die Steuerelemente in ein TableLayoutPanel packt kann man dies über die Margin Eigenschaft erreichen.

    Für oben würde ich die Steuerelemente vertikal etwas weiter auseinander platzieren - IMO sieht es etwas gedrängt aus. Und die Margin-Werte für Top / Bottom bei Labeln und Texboxen etwas größer wählen, so dass die Textlinie übereinstimmt. Dann ist die ComboBox zwar immer noch höher als ihre Nachbarn, aber im "Lesefluß" auf einer Linie.

    Gruß Elmar

    Mittwoch, 10. April 2013 14:32
  • Hallo Elmar,

    vielen Dank, bin grad vom Kunden zurück und es war kein sehr angenehmes Meeting.

    Ich werde höchstwahrscheinlich eine eigene Version erstellen müssen, weil die Design-Vorgaben mir nicht viel andere Optionen offen lassen. Die Labels sind transparent, außerdem kann man sie recht einfach mit der Anchor-Property in die Mitte der Zelle zwingen, die TextBoxen sind sowieso die dominierenden Objekte, es bleibt also an den Comboboxen hängen.

    Wenn der Unterschied ein paar zerquetschte Pixeln wären, dann würde ich mit deinem Ansatz vorgehen und durch geschicktes positionieren den Größenunterschied kaschieren, nur wir sprechen hier von 15:25, das lässt sich bei gegebener Zeilenhöhe des TableLayoutPanels nicht mehr kaschieren, da wird auf jeden Fall ein Teil des Nachbarfeldes verdeckt. Und was ich als eigenes Formular eingestellt habe ist in der Applikation einer von 10 unterschiedlichen Detail-Containern, die je nach Bedarf in ein Hauptform eingefügt werden, auf die ich auch noch Rücksicht nehmen muss.

    Es bleibt also nur der Sysiphus einer UserControl...

    Danke nochmals für deine Bemühungen!

    LG aus Wien
    Peter

    PS: Weisst Du vielleicht von einem Beispiel irgendwo in den Tiefen des Netzes?
    • Bearbeitet Peter_SkAt Mittwoch, 10. April 2013 15:41 PS zu spät eingefallen
    Mittwoch, 10. April 2013 15:40
  • Hallo Peter,

    ich leide mit Dir!

    Ich hatte mir bei der letzten Antwort Bemerkungen zum Windows 3.0 Look unterdrückt... Aber wenn sich Design-Vorgaben an Pixeln anstatt Funktionalität orientieren, dann  könnte Hopfen und Malz verloren sein ;) Design wäre eher so etwas:
    http://www.istartedsomething.com/20080109/frog-design-wpf-sexy-enterprise-software/ (Wenn auch Geschmackssache)

    Was eine Vorlage für eine ComboBox angeht:
    Ich habe noch einen alten Prototyp einer Multi-Column ComboBox auf .NET 1.1 Basis rumliegen. Dort hatte ich einen FlatStyle implementiert, wenn auch nicht ganz komplett. Die Endversion wurde mit .NET 2.0 realisiert, da fehlt er aber und die kann ich eh nicht rausrücken. Wie viel noch fehlt kann ich aber nach gut acht Jahren nicht mehr sagen.

    Falls Interesse besteht, könnte ich den Teil (ohne mehrere Spalten) extrahieren.

    Gruß Elmar

    Mittwoch, 10. April 2013 18:19
  • Halo Elmar,

    Der Kunde ist König, auch wenn oft ein nervender...

    das Design des Frog Sales Tool 6.0 ist echt ein Hammer (bis auf das Frog green, das nicht ganz meins ist...), aber es dürfte offenbar fundamentale Unterschiede zwischen WPF und Forms geben, denn in der Abbildung dort ist die Combobox gleich hoch wie TextBoxen. Und ich bezweifle, dass der Font 4.1 pt klein ist... :-)

    Ich habe jetzt seit dem letzten Post im Web herumgesucht und nichts gefunden, was nach einer custom Combobox aussieht, d.h. was immer du irgendwo in einer Goodies-Library hast und entbehren kannst, ist willkommen. Vielleicht schaffe ich es, aus dem Halbfabrikat ein Fertigprodukt zu machen. Das würde ich dir dann natürlich zurückgeben, vielleicht kannst du es ja noch einmal brauchen...

    LG Peter

    Mittwoch, 10. April 2013 19:06
  • Hi Peter,

    manch mal muss man auch einen König zu seinen Glück zwingen ;) .

    Hier ein paar Beispiel, die dir vielleicht weiter helfen. (Ich denke was du brauchst ist das überschreiben der OnPaint Methode Beispiel 1).

    http://stackoverflow.com/questions/15599395/how-to-create-custom-combo-box-in-windows-form-applicationvb-net

    http://stackoverflow.com/questions/1869093/custom-net-combobox-control

    http://www.codeproject.com/Articles/3994/Custom-ComboBoxes-with-Advanced-Drop-down-Features

    MFG
    Björn

    • Als Antwort markiert Peter_SkAt Dienstag, 16. April 2013 09:08
    Mittwoch, 10. April 2013 20:18
  • Danke Björn,

    zwingen ist gut, aber nur wenn das keine Auswirkungen auf Cash hat... ;-)

    Ich habe mir die drei Links jetzt einmal kurz angeschaut, ich werde sie dann morgen durcharbeiten, das schaut alles recht gut aus. Vielen Dank auf jeden Fall!

    Gruß

    Peter

    Mittwoch, 10. April 2013 21:25
  • Hallo Peter,

    WPF ist deutlich weiter entwickelt - bei Windows Forms ist seit .NET 2.0 Stillstand.

    Ich habe den Zeichencode für die flache Combobox übertragen und zusammen mit einem Mini-Beispielprojekt als Download bereitgestellt:

    www.elmarboye.de/download/FlatCombo.7z

    "Stauchungen" habe ich nicht versucht. Da die Größen weiterhin auf der Standard-ComboBox basieren, wird man da noch etwas fummeln müssen.

    Gruß Elmar

    • Als Antwort markiert Peter_SkAt Dienstag, 16. April 2013 09:09
    Donnerstag, 11. April 2013 12:50
  • Hallo Elmar,

    danke, dass du dir auch noch die Arbeit angetan hast! Es liegt jetzt wohl wieder ein langes Wochenende vor mir, und das, wo nach gefühlten 2 Jahren Winter heute bei uns endlich wieder der Frühling eingezogen ist...

    LG Peter

    PS: Nur so aus Interesse: gibt es einen halbwegs einfachen Portierungspfad Forms -> WPF? Woran ich arbeite ist eine immer wieder aufpolierte Applikation, deren Ursprung wahrscheinlich noch VB 6.0 gewesen ist.

    • Bearbeitet Peter_SkAt Donnerstag, 11. April 2013 15:37 vor Inbetriebnahme der Tastatur Hirn einschalten... (PS erst später eingefallen, wie üblich...)
    Donnerstag, 11. April 2013 15:18
  • Hallo Peter,

    Nein, eine auch nur ansatzweise automatisierte Migration Windows Forms nach WPF gibt keinen Sinn. Die Konzepte sind zu unterschiedlich.

    Lesestoff  - wenn Zeit bleibt:
    WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

    Für größere Applikationen sollte man ein Framework verwenden, wie Prism, Caliburn Micro oder MVVM Light.

    Apropos verspäteter Frühling: Ich darf das Wochenende den Garten meiner Eltern umgraben... naja, kann auch eine Erholung sein, wenn die Knochen nicht so steif geworden wären ;)

    Gruß Elmar

    • Als Antwort markiert Peter_SkAt Dienstag, 16. April 2013 09:09
    Donnerstag, 11. April 2013 15:44
  • Hallo Elmar,

    Super, danke für die Info! Also wird am WE nicht nur gerackert, sondern auch gelesen.

    Steife Knochen? Ich war heute zum ersten Mal in diesem Jahr mit dem Fahrrad bei einem Kunden, der von mir zu Hause aus ziemlich einen Berg hinauf den Firmensitz hat. Kaum dass ich hingekommen bin, mir hing die Zunge bis zu den Knöcheln hinaus... Bis zum Sommer werde ich aber hoffentlich wieder halbwegs in Form sein.

    Danke & lG 
    Peter 


    • Bearbeitet Peter_SkAt Donnerstag, 11. April 2013 16:29
    Donnerstag, 11. April 2013 16:29
  • Hallo Peter,

    sollte eine der Antworten Dir geholfen haben, markiere sie bitte als Antwort.

    ... und fuer den Muskelkater - ein schoenes heisses Bad wirkt manchmal Wunder ;-)


    Grüße,

    Stefan Kleinewillinghoefer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwicklern“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden koennen.

    • Als Antwort markiert Peter_SkAt Dienstag, 16. April 2013 09:09
    Freitag, 12. April 2013 06:48
  • Hallo Stefan,

    ich wollte die Antworten am Wochenende durcharbeiten um zu sehen, wo ich mit dem wenigsten Aufwand zum Ziel komme, somit sind derzeit für mich alle Inputs von Elmar, Björn und dir wertvoll, wobei ich situationsbedingt derzeit vielleicht den Tipp mit der heißen Badewanne etwas höher bewerten würde als die mit den Comboboxen... ;-)

    Kann man auch mehrere Posts als Antwort Markieren?

    LG Peter

    Freitag, 12. April 2013 07:10

  • Kann man auch mehrere Posts als Antwort Markieren?

    LG Peter

    Klar.

    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/

    • Als Antwort markiert Peter_SkAt Dienstag, 16. April 2013 09:10
    Freitag, 12. April 2013 07:14