Benutzerdefiniertes Steuerelement mit einem weiteren ComboBox-Steuerelement

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von BigBen2003.

    Benutzerdefiniertes Steuerelement mit einem weiteren ComboBox-Steuerelement

    Hallo,

    in einem DataGridView Control ist u.a. ein ComboBox-Element enthalten. Nach dem Anklicken sollen alle Einträge aufgelistet werden.

    Um die Liste aller Elemente anzigen zu lassen, muss der Anwender jedoch zwei Einzelklicks vornehmen:

    Beim ersten Anklicken passiert scheinbar nichts.

    Erst beim zweiten Anklicken wird die Liste mit allen Einträgen angezeigt.

    Bei der Internet-Recherche zu einer möglichen Ursache und Lösung bin ich auf diese Webseite gestoßen:

    Hier wird erläutert, wie man Mausklicks quasi an weiterleiten kann.

    Im vorliegenden Fall weiß ich nicht, von welchem Steuerlement das Ereignis Mausklick abgefangen werden muss.

    Kann da jemand Tips geben?

    Beim Auswählen eines Eintrags aus der ComboxBox-Liste wird der Eintrag selbst nicht korrkt ins Dataset übernommen. Erst nachdem z.B. ein anderer Datensatz markiert wird, erfolgt die Übernahme des neuen Eintrags aus der Combobox ins DataSet. Falls zuvor keine weiteren Änderungen im dataset vorgenommen wurden, wird beim Schließen der WinForm auch keine Warnung wegen ungespeicherter Einträge angezeigt. Hierzu habe ich keine Iddee, wie die Ursache eingegrenzt werden kann.
    Dassis beides "Working as Designed".
    1. 2 mal in die Zelle klicksen musste, weil der erste Klick versetzt die Zelle in den Editiermodus, der 2. Klick ist eine Editier-Aktion.
      Es ist zunächstmal nicht erwünscht, dass allein das Anwählen einer Zelle die Editier-Aktion auslöst - solch würde ein Grid "zu kabbelig" machen. (Ansichtssache)
      Vlt. kann man den Editiermodus erzwingen, durch Aufruf von "BeginEdit" oder sowas - müsste ich auch erst recherchieren.
    2. Eine Eingabe per DGV in einen Datensatz ist erst abgeschlossen, wenn die Zeile verlassen wird. So kannst du mehrere Werte ändern, und es ist nur eine Eingabe.
      Den Abschluss einer Eingabe kann man erzwingen durch Aufruf von DGV.EndEdit.

    Da letzterer Vorschlag alle Spalten betreffen würde, hier eine experimentelle Methode:

    VB.NET-Quellcode

    1. Private Sub Dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles Dgv.CellClick
    2. If e.ColumnIndex <> TargetColumnIndex Then Exit Sub
    3. Dgv.BeginEdit(False)
    4. If Dgv.EditingControl Is Nothing OrElse TypeOf Dgv.EditingControl IsNot ComboBox Then Exit Sub
    5. Dim ComboBox = DirectCast(Dgv.EditingControl, ComboBox)
    6. AddHandler ComboBox.SelectionChangeCommitted, AddressOf CommitComboBoxValue
    7. ComboBox.DroppedDown = True
    8. End Sub
    9. Private Sub CommitComboBoxValue(sender As Object, e As EventArgs)
    10. Dim ComboBox = DirectCast(sender, ComboBox)
    11. RemoveHandler ComboBox.SelectionChangeCommitted, AddressOf CommitComboBoxValue
    12. Dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
    13. Bs.EndEdit()
    14. Bs.MoveNext()
    15. Bs.MovePrevious()
    16. End Sub

    Experimentell deshalb, weil nur der BindingSource-(BS-)Positionswechsel auch die ComboBox aus ihrem Editiermodus herausholt. Der DGV-Commit und BS.EndEdit reichen dafür nicht. Das Problem aber dabei: Wenn man in der letzten Zeile ist, verändert sich die Position der selektierten Zeile. Klar, kann man ja vorher auswerten, ob man am Ende der Tabelle ist und dann ggf. erst MovePrevious und dann MoveNext aufrufen, aber 1. sauber ist das m.E. auch nicht. Und 2.: Wenn man nur eine Zeile überhaupt hat, steht man da wie doof. Alternativ kann man zwar noch den CE-Fokus weg vom DGV und dann gleich wieder zurück zum DGV wechseln, aber sauber sieht auch anders aus.
    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.