Combobox kein Scrollen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Combobox kein Scrollen

    Hallo,

    ich habe ein DGV, das an unterschiedliche Quellen bindet abhängig von einer Combobox. In der Combobox wird die Materialstärke ausgewählt, das ändert die zugewiesene BindingSource.

    Beim Scrollen wählt man allerdings auch ein anderes Item in der CB aus. Woraufhin sich auch entsprechend die Anzeige ändert, das fällt so stark gar nicht auf, abgesehen davon das im DGV nicht gescrollt wurde, weil das ja noch nicht selected wurde.
    Naja auf jeden Fall ist das ein bisschen verwirrend. Da kann man sich schnell Werte angucken, die man garnicht sehen wollte und wundert sich.

    Kann man das Durchscrollen in der CB abschalten?

    Viele Grüße
    @Haudruferzappeltnoch Mit welchem Code befüllst Du die ComboBox?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Haudruferzappeltnoch Die ComboBox scrollt nur, wenn sich die Maus darüber befindet, unabhängig davon, ob sie den Fokus hat oder nicht.
    Wenn Du das Scrollen unterbinden willst, musst Du sie auf .Enabled = False stellen.
    Du kannst auch ein (fast) durchsichtiges Panel darüber legen, das dann das Scrollen abfängt. Um die ComboBox wieder scrollen zu lassen, kannst Du das Panel per Mausklick wegnehmen.
    Wenn die ComboBox ihren Fokus verliert, machst Du das Panel scharf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    wenn die Maus nicht darüber ist.
    Vergleiche mal die Properties:

    Und:
    Maus drüber und Fokus haben ist zweierlei:
    (Form, 2 ComboBoxen, 2 Label, 1 Timer)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. If ComboBox1.Focused Then
    4. Label1.Text = "Focused"
    5. Else
    6. Label1.Text = "not Focused"
    7. End If
    8. If ComboBox2.Focused Then
    9. Label2.Text = "Focused"
    10. Else
    11. Label2.Text = "not Focused"
    12. End If
    13. End Sub
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. Timer1.Enabled = True
    16. End Sub
    17. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also jetzt wird komisch. Tatsächlich hängt es nicht mit dem Fokus zusammen, wenn ich das Ganze auf einem Windows 10 rechner probiere.
    Aber wenn ich es auf einem Windows Server 2012 benutze, dann hängt es nur noch vom Fokus ab und nicht von der Mausposition.

    Die Combobox Properties stimmen bis auf Name, Text, Size, Location, Locked = False, TabIndex = 0

    Haudruferzappeltnoch schrieb:

    Locked = False
    macht, dass Du das Control im Designer verschieben kannst.
    Ich arbeite mit Win10, Studio 19, leider kann ich da nix anderes probieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Die Combobox Properties stimmen bis auf
    Dann wäre ein Testprogramm, welches auf beiden Rechnern zum Vergleich getestet wird, sinnvoll. Ein Nachbau kann immer Abweichungen mit sich bringen, hab ich schon mehrfach erlebt.
    Ich habe Folgendes ohne Unterschiede probiert:
    leeres DGV, ComboBox (CBX) im DropDownList-Mode, dann Deine Materialdickeneinträge beim Programmstart eintragen lassen. Abhängig vom gewählten CBX-Eintrag wird der DGV-Inhalt geändert.
    Unabhängig vom Eingabefokus reagiert das DGV auf das Mausradscrollen, wenn die Maus über dem DGV ist. Genauso die CBX. Nur, wenn die Maus über ihr ist, wird ein anderes CBX-Item selektiert.
    Getestet auf Win10 und WinServer 2019, je 64 Bit.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, ich habe es gerade nochmal auf einem Windows Server 2019 getestet. Dort alles weiterhin einwandfrei.

    Also es liegt am älteren Betriebssystem scheinbar 2012 entspricht ja Windows 7.
    Ich habe mir nie Gedanken darüber gemacht, aber mir ist nun aufgefallen, das ist bei noch viel mehr Anwendungen so, vielleicht ist das mit Windows 10 umgestellt worden mit dem Fokus?

    Ich kann morgen auch explizit nochmal ein Minimalprogramm machen. Das wird auch mit nur Form und CBX einfach zu prüfen sein. Bzw. nur mit DGV. Rs wird nur gescrollt wo auch Fokus da ist, egal was für ein Element
    Ja also hier ists genauso.

    Aber ich kann das Problem ja mit dem Fokus addressieren.

    Dazu hätte ich noch eine Frage, ich habe mehere TabPages und pro TabPage ein DGV. Beim Wechseln der Tabpage läuft der Fokus ja auch auf die TabPage daher dachte ich ziehe ich den automatisch wieder auf mein DGV, in etwa so:

    VB.NET-Quellcode

    1. Private Sub TabControl1_Selected(sender As Object, e As TabControlEventArgs) Handles TabControl1.Selected
    2. (e.TabPage.Controls.OfType(Of DataGridView))(0).Focus()
    3. End Sub

    In dieser Variante sagt mir das Studio ich kann die Klammern um e.TabPage.Controls.OfType(Of DataGridView) entfernen. Tue ich dies, dann erhalte ich jedoch eine Fehler bei (0) "zu viele Argumente für die Erweiterungsmethode OfType". Was läuft da schief?

    Nebenbei bemerkt, das gehört ja auch zum Windows 2012 Fehler: Wenn man das in meinem Beispielprogramm einbaut für Comboboxen statt DGVs, dann kann nach Tabpagewechsel in der CB gescrollt werden. Egal wo der Mauszeiger ist.
    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @Haudruferzappeltnoch So funktioniert das bei mir:

    VB.NET-Quellcode

    1. Private Sub TabControl1_Selected(sender As Object, e As TabControlEventArgs) Handles TabControl1.Selected
    2. Dim ctrl = e.TabPage.Controls.OfType(Of DataGridView)
    3. If ctrl IsNot Nothing Then
    4. ctrl(0).Focus()
    5. End If
    6. End Sub
    Wenn das DGV den Fokus hat, kannst Du noch lange nix in eine Zelle eintragen.
    Welches (Sub-)Control soll denn tatsächlich aktiv sein?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da wird auch nix eingetragen. Das "View" nehme ich meist sehr wörtlich
    Naja das Dgv ist das einzige Subcontrol in der Tabpage.
    Und das "soll" nich aktiv sein, das "muss" aktiv sein aufgrund dieses Focus-Scroll-Verhaltens im älteren Windows.

    Das kann bei mir nicht Nothing sein, deswegen prüfe ich das auch nicht.
    Ging mir eigentlich nur um das Problem warum das Studio die zweite Klammer nicht richtig zuordnen kann, wenn man den Teil davor nicht abgrenzt.
    Dann lass das If doch einfach weg:

    VB.NET-Quellcode

    1. Private Sub TabControl1_Selected(sender As Object, e As TabControlEventArgs) Handles TabControl1.Selected
    2. Dim ctrl = e.TabPage.Controls.OfType(Of DataGridView)
    3. ctrl(0).Focus()
    4. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Was läuft da schief?
    IntelliSense-Fehler oder VS-Verschlimmbesserung.
    Richtig wäre

    VB.NET-Quellcode

    1. e.TabPage.Controls.OfType(Of DataGridView)()(0).Focus() 'eigentlich eher .Select statt .Focus verwenden
    Also noch ein Klammerpaar vor dem (0). Muss man auch bei Folgendem machen, wenn man eine Klasseninstanz nicht zwischenspeichern will, sondern nur deren Methode aufrufen will:

    VB.NET-Quellcode

    1. Call New Klasse().Methode(Parameter) 'ok
    Ohne Klammern geht es nicht:

    VB.NET-Quellcode

    1. Call New Klasse.Methode(Parameter) 'Fehler!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.