UserControl soll testen ob es selbst und/oder das zugehörige Form den Fokus hat

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von roepke.

    UserControl soll testen ob es selbst und/oder das zugehörige Form den Fokus hat

    Hallo zusammen,

    ich habe ein UserControl geschrieben und in einem Form platziert. Innerhalb des UserControls will ich nun testen ob das UserControl selbst oder das Form in dem es sich befindet den Fokus hat.
    Der Prozess im UserControl soll stoppen sobald entweder ein anderes Control auf dem Form oder ein anderes Form selektiert wird.

    Mit

    VB.NET-Quellcode

    1. Private Sub MyUserControl_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
    2. MyUserControlHasFocus = True
    3. End Sub


    bzw.

    VB.NET-Quellcode

    1. Private Sub MyUserControl_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Leave
    2. MyUserControlHasFocus = False
    3. End Sub


    wird Leave nur ausgeführt, wenn ich ein anderes Form selektiere.

    Und mit

    VB.NET-Quellcode

    1. Me.Focus()
    oder

    VB.NET-Quellcode

    1. Me.Focused
    innerhalb des UserControls wird der nachfolgende Code nie erreicht, auch wenn der Fokus auf dem UserControl ist.

    Bin dankbar für jede konstruktive Antwort.

    roepke schrieb:

    innerhalb des UserControls wird der nachfolgende Code nie erreicht
    Poste mal den relevanten Code, damit wir das nachvollziehen können.
    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!
    @ErfinderDesRades: danke, das hat schon sehr geholfen
    @RodFromGermany: der Code selbst ist an dieser Stelle nicht relevant, er funktioniert, nur die Bedingung zur Ausführung tat es nicht.

    Ich habe im UserControl einen Timer und innerhalb des Timers eine Abfrage ob das UserControl den Fokus hat.
    Ist dem so, dann wird der auszuführende Code ausgeführt.

    VB.NET-Quellcode

    1. Private Sub Timer100ms_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer100ms.Tick
    2. If Me.ContainsFocus() Then
    3. 'Auszuführender Code
    4. End If
    5. End Sub


    Mit ContainsFocus() funzt das jetzt auch soweit.
    Ein Problem habe ich allerdings noch:
    Das UserControl ist auf einer TabPage, klicke ich nun den Reiter dieser TabPage an, dann verliert das UserControl den Fokus und damit stoppt auch die Ausführung des Codes.
    Ich würde es gerne noch dahingehend verbessern, dass der Code auch ausgeführt wird, wenn ich auf der richtigen TabPage bin, also die TabPage auf dem das UserControl platziert ist den Fokus hat.
    Muss ich diese Eigenschaft an das UserControl seitens des TabControls übergeben oder gibt es eine Möglichkeit aus dem UserControl heraus herauszufinden, ob die TabPage des TabControls auf dem das USercontrol platziert ist den Fokus hat?
    Im Prinzip also etwa so:

    VB.NET-Quellcode

    1. Private Sub Timer100ms_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer100ms.Tick
    2. If Me.ContainsFocus() or "ein Test ob die TabPage des Fokus hat" Then
    3. 'Auszuführender Code
    4. End If
    5. End Sub



    Danke für Eure Hilfe.
    @roepke Wahrscheinlich ist CDeine Bedien-Philosophie etwas verworren.
    Klär uns mal auf, wie das ganze funktionieren soll.
    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!
    Ich versuch‘s nochmal mit anderen Worten:

    Also ich habe ein Form, in diesem Form gibt es ein TabControl und in diesem Tab Control auf einer TabPage ein einizges UserControl.
    Das UserControl besitzt einen freilaufenden Timer in dem bestimmte Dinge immer und immer wieder erledigt werden.
    Manche dieser Dinge sollen aber nur dann erledigt werden, wenn die zugehörige TabPage selektiert wurde ODER das UserControl selbst den Fokus hat.
    Klicke ich auf eine andere TabPage sollen innerhalb der Timerroutine manche Dinge eben nicht erledigt werden.

    => Ich merke gerade, dass es eigentlich vollkommend ausreichend ist, wenn das UserControl wissen würde, ob die TabPage auf dem es sich befindet gerade selektiert ist.

    Im UserControl frage ich innerhalb der Timerroutine mit

    VB.NET-Quellcode

    1. If Me.ContainsFocus() Then
    2. ‚das hier wird nur ausgeführt, wenn das UserControl den Fokus hat
    3. End If

    ab, ob es den Fokus hat. Das funktioniert auch soweit.

    Wurde nun über das TabControl eine andere TabPage ausgewählt und klicke ich innerhalb der TabControl Reiter auf die zugehörige TabPage, dann hat das UserControl ja noch nicht den Fokus, dazu muss ich es erst selbst noch anklicken.
    Ich möchte aber meine Abfrage gerne dahingehend verändern, dass berücksichtigt wird, ob die zugehörige TabPage selektiert ist.
    Also kurz: TabPage im TabControl selektiert auf dem sich das UserControl befindet und das UserControl führt den Code aus, den es nicht ausführen würde, wenn eine andere TabPage ausgewählt ist.

    Mit

    VB.NET-Quellcode

    1. Dim test As String = Me.Parent.Name

    innerhalb des UserControls bekomme ich den Namen der TabPage auf dem es sich befindet.

    Wie kann ich aber erfahren, ob diese TabPage auch über die Reiter selektiert wurde oder gerade eine andere selektiert ist?

    Besten Dank.
    @roepke Sieh Dir mal im ObjectBrowser an, welche Properties bei einem TabControl mit Selected anfangen.
    Ich denke schon, dass es genügen sollte, wenn der entsprechende Tab aktiv ist.
    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!
    @RodFromGermany: So langsam steige ich dahinter. Die Funktion des ObjectBrowser erschloss sich mir bisher nicht wirklich. VB ist auch nicht die Software meiner Wahl, ich bin da irgendwie reingeschlittert. Aber so langsam gewöhne ich mich daran.

    Habe jetzt im UserControl mal folgendes gemacht:

    VB.NET-Quellcode

    1. Dim c As Control = Me.Parent.Parent
    2. Dim tc As TabControl = CType(c, TabControl)
    3. If tc.SelectedIndex = 2 Then
    4. 'Mach was
    5. End If


    Wobei der Wert mit dem SelectedIndex verglichen wird als Property übergeben wird.
    Die TabPage selbst hat ja leider keine "IsSelected" Eigenschaft oder was Ähnliches.
    Schöner wäre eine Lösung vom Typ

    VB.NET-Quellcode

    1. Dim d As Control = Me.Parent
    2. Dim tp As TabPage = CType(d, TabPage)
    3. If tp.IsSelecetd = True Then 'ACHTUNG 'IsSelected' ist fiktiv und wäre ein Wunsch von mir
    4. 'Mach was
    5. End If
    @roepke Du kannst doch eine von TabPage abgeleitete Klasse verwenden, der Du diese Property gibst.
    Allerdings musst Du dann selbst dafür Sorge tragen, dass diese Property auch zurückgesetzt wird.
    Besser ist es ggf., beim Aktivieren einer TabPage den Controls zu sagen, dass sie dran sind bzw. dass sie nicht mehr dran sind, wenn sie abgewählt wurden.
    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!
    Danke an RodFromGermany,

    habe jetzt eine Kombination aus Deinem Vorschlag dem Control beim Aktivieren der TabPage mitzuteilen dass es dran ist und einer Abfrage ob das ParentForm überhaupt den Fokus hat gebaut.
    Damit ist meine Anforderung (zumindest habe ich im Moment das Gefühl) erfüllt.

    LG