VB-NET - In einer eigenen Klasse ein Formular-Steuerelement referenzieren und auf dessen Ereignisse in und außerhalb der Klasse reagieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von anzah.

    VB-NET - In einer eigenen Klasse ein Formular-Steuerelement referenzieren und auf dessen Ereignisse in und außerhalb der Klasse reagieren

    Hallo,

    nachdem ich nun vergeblich versucht habe, eine Antwort auf mein Problem bei ähnlichen Theman zu finden, muss ich mich als Gelegenheitsprogrammierer doch noch an euch wenden:

    Ziel:
    Eine ComboBox auf einem Formular mit zusätzlichen Suchfeatures ausstatten und als Klasse mehrfach verwenden können, sodass bei mehreren ComboBoxen derselbe Funktionsumfang dieser Klasse besteht.
    Die Klasse soll auch mit zur Laufzeit angelegten ComboBoxen vereinbart werden können.

    Stand:
    Den ersten Teil habe ich bereits erledigt.
    Das Problem besteht in der flexiblen Zuordnung der Klasse zu den ComboBoxen.

    VB.NET-Quellcode

    1. Public Class clsSearchComboBox
    2. 'Inherits ComboBox
    3. Public WithEvents oComboBox As ComboBox
    4. Private oToolTip As ToolTip
    5. Public Sub New(ByRef oCobo As ComboBox)
    6. oComboBox = oCobo
    7. End Sub
    8. #Region "ComboBox"
    9. Private Sub oComboBox_KeyDown(sender As Object, e As KeyEventArgs) Handles oComboBox.KeyDown
    10. '...
    11. End Sub
    12. Private Sub oComboBox_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles oComboBox.PreviewKeyDown
    13. '...
    14. End Sub
    15. Private Sub oComboBox_TextUpdate(sender As Object, e As EventArgs) Handles oComboBox.TextUpdate
    16. '...
    17. End Sub
    18. Private Sub oComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles oComboBox.SelectedIndexChanged
    19. End Sub
    20. #End Region
    21. #Region "ToolTip"
    22. Private Sub CheckToolTip()
    23. '...
    24. End Sub
    25. Private Sub CheckToolTip_Cobo_PreviewKeyDown(ByVal eaKey As Keys)
    26. '...
    27. End Sub
    28. Private Function CheckKeyCode(keaE As KeyEventArgs, kKC As Keys) As Boolean
    29. '...
    30. End Function
    31. #End Region


    Probleme:
    • die Zuordnung gelingt mir nicht
    • die Funktionen bereits bestehender Ereignisse im Code des Formulars funktionieren nicht (da keine Zuordnung zur Klasse möglich ist)
    • ich möchte zum Klassenereignis z. B. SelectedIndexChanged auch im Code der Form ein solches Ereignis (SelectedIndexChanged) verwenden können; welcher Code dann zuerst ausgeführt wird, wäre erstmal egal)

    Im Code der Form habe ich bislang für die Referenz das:

    VB.NET-Quellcode

    1. Public Class Fo_Main
    2. Public WithEvents CoBo_PO_P As clsSearchComboBox
    3. Private Sub Fo_Main_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    4. CoBo_PO_P = New clsSearchComboBox(Me.CoBo_PO_Project)
    5. End Sub
    6. End Class


    Kann mir hierzu bitte jemand einen Tip(p) geben?
    Gib mal bitte ein Beispiel, was dann dabei rauskommen soll. Also ein Anwendungsbeispiel. Du hast dann ne clsSearchComboBox auf Deinem Form und was soll dann genau passieren, wenn der User wasauchimmer macht?
    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.
    Der User gibt beliebige Zeichen in die Combobox ein, bei jedem erneuten Tastendruck sucht eine Routine nach Übereinstimmungen in der Liste und gleicht einen sichtbaren Tooltext entsprechend ab.
    Hat der User einen vollständigen Begriff eingegeben, welcher ein Teilstring eines Eintrags ist, wird mit den Tasten Pfeil hoch und runter nun die gesammte Liste nach allen Items, welche den Begriff enthalten, in der entsprechenden Pfeilrichtung abgesucht und nacheinander im Tooltext angezeigt.
    Hat der User seinen Eintrag (Item) gefunden, wird über die Enter-Taste der Eintrag ausgewählt und das damit verbundene Ereignis der Combobox ausgelöst.

    Der Vorteil dieser Methode ist aus meiner Sicht: Es ist völlig egal, wo sich das oder die eingegebenen Zeichen im jeweiligen Item (Text) befinden, die Suchfunktion zeigt im Tooltext immer nur Items mit dem gesuchten Wortlaut an.
    In der ComboBox steht also

    Quellcode

    1. anzah
    2. Bartosz
    3. Codar
    4. Dksksm
    5. exc-jdbi
    6. FormFollowsFunction

    Ich geb ar ein und sehe in nem Tool(Tip(?))Text Bartosz und Codar.

    anzah schrieb:

    Hat der User einen vollständigen Begriff eingegeben, welcher ein Teilstring eines Eintrags ist
    Das träfe aber auch bei einem Leerzeichen zu. Oder was ist ein vollständiger Begriff, der ein Teilstring eines Eintrags ist?

    anzah schrieb:

    in der entsprechenden Pfeilrichtung
    Was für ne Pfeilrichtung? Wodurch wird die festgelegt?
    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.
    Für "ar" (vollständiger Begriff):
    • du gibst a ein
    • anzah wird im Tooltip angezeigt
    • du gibst zum a ein r ein => ar
    • Bartosz wird im Tooltip angezeigt
    • du drückst auf der Tastatur die Pfeil-nach-unten-taste
    • Codar wird im Tooltip angezeigt
    • du drückst auf der Tastatur die Pfeil-nach-oben-taste
    • Bartosz wird im Tooltip angezeigt
    • du drückst auf der Tastatur die Enter-Taste
    • Bartosz wird ausgewählt und statt ar als ComboBox.Text angezeigt, Tooltip verschwindet, das Auswahlereignis wird ausgelöst
    So, ich habe es hinbekommen:
    • Die Klasse mit der erweitereten Suchfunktion bleibt stets isoliert von der auf die Klasse verweisenden ComboBox (ComboBox der Klasse ist Private).
    • Gleiche Ereignisse (z. B. TextChanged) können nebeneinander existieren, jedoch werden die Klassenereignisse immer zuerst ausgelöst.
    • Die Funktionen der Klasse werden im Container der bestehenden ComboBox zugewiesen:

    VB.NET-Quellcode

    1. ''' 1. Deklaration: Dim oCoBo as clsSearchComboBox
    2. ''' 2. Verweis: oCoBo = New clsSearchComboBox(CoBo_Bestehende)
    3. ''' (CoBo_Bestehende = bestehende ComboBox eines Formulars)
    4. ''' Zum Schluss beim Schließen des Formulars:
    5. ''' Speicher leeren: oCoBo = Nothing


    Damit ist das Thema beendet, danke an die Mitwirkenden.
    Bilder
    • screen1.png

      1,68 kB, 253×68, 226 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „anzah“ ()

    Hallo ErfinderDesRades, ja, das ist interessant, danke.

    Mir ist es bei meiner Lösung wichtig gewesen, bekannte Begriffe oder Wortfetzen auch innerhalb eines ListItem-Textes zu suchen.
    In dem obigen Beispiel screen1.png wusste der User lediglich, dass sein gesuchter Eintrag ein "x" bzw. ein "xc" enthält, jedoch wusste er nicht mehr, wie der gesuchte Eintrag anfing. Bei AutoCompletion wird meines Wissens nur der Anfang zur Eingrenzung von Suchergebnissen bewertet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „anzah“ ()