vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
UserControl und Parent-Form 
Autor: thuring
Datum: 27.12.23 11:19

Hallo zusammen, folgendes Problem:
Ich habe ein Usercontrol, das ein Navigator-Control enthält. Das Usercontrol verwende ich in einer Form (Parent-Form).
Nun möchte ich bei Click auf die Buttons des Navigators diese Click-Event auf der Form empfangen, auswerten und entsprechend eine Sub in der Form starten.
Ich habe schon Etliches über die sogenannten Delegates gefunden (ausschließlich C#) und meistens auch noch bzgl. Webpages, was alles nicht für mein Problem hilfreich war.
Hat jemand einen Tipp/Link zu dieser Thematik, für VB und Winforms, bitte?

Grüße - Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 28.12.23 08:11

Hallo!

Eine einfache Variante ist die Event-Weiterleitung des Control-Events
vom Usercontrol zur Parent-Form.

Hier ein Beispiel für das Click-Event eines Buttons.

Das UserControl....
Public Class UserControl1
 
    Dim WithEvents MyUCButton As New Button With {.Parent = Me, .Top = 10, _
      .Left = 10, .Text = "Demo"}
 
    Public Event UCButtonClicked(sender As Object, e As EventArgs)
 
    Private Sub MyUCButton_Click(sender As Object, e As EventArgs) Handles _
      MyUCButton.Click
        RaiseEvent UCButtonClicked(Me, EventArgs.Empty)
    End Sub
 
    Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles _
      MyBase.Load
 
    End Sub
End Class
Das Formular mit dem UserControl .....
Public Class frmUCEventDemo
 
    Dim WithEvents uc1 As New UserControl1 With {.Parent = Me}
 
    Private Sub uc1_UCButtonClicked(sender As Object, e As EventArgs) Handles _
      uc1.UCButtonClicked
        MsgBox("UC-Button ist gedrückt worden")
    End Sub
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 29.12.23 12:08

Hallo Manfred, danke für die schnelle Antwort!
Werde es mal ausprobiren...
Gruß - Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 30.12.23 12:28

Es ist nicht so einfach auszuprobieren:

Kann man die Zeile
Dim WithEvents uc1 As New UserControl1 With {.Parent = Me}
weglassen, weil das UserControl schon via Designer auf der Form sich befindet?

Es gibt bei meinem UserControl nicht nur den einen Button (MyUCButton), sondern es geht um 4 ToolstripButtons (keine Parent-Eigenschaft).

Gruß - Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 30.12.23 12:46

Hallo!

Die Codezeile mit der Deklaration einer Insatnz des UserControl ist wegzulassen,
wenn der Designer bereits eine entsprechende Deklaration erstellt hat
(Withevents oder Addhandler-Code für die UserControl-Events!)


Grundsätzlich:
Ein UserControl bildet als spezielle Klasse ein erweitertes Control ab, das
dem Nutzer Methoden, Eigenschaften und Events verfügbar machtm um mit dem
Usercontrol zu kommunizieren.
Es ist eher unpraktisch, Ereignisse von Controls, die im Usercontrol deklariert sind,
direkt an die Parentform weiterzuleiten. Die Ereignisse des Usercontrol sollten in
Zusammenhang mit dessen Funktionalität stehen.

Dabei spielt es keine Rolle, ob der Sender des internen Events über eine
Parent-Eigenschaft verfügt. Bei der Weiterleitung durch die UserControl-Klasse
gibt man als Sender "Me" an.

Wenn ich das richtig verstanden habe, möchtest Du eine Aktion des Anwenders,
die zum Aulösen eines ToolstripButton-Events im Usercontrol geführt hat, als Ereignis
des Usercontrol an das Parent-Formular melden.
Dabei wäre zu klären, ob und welche Informationen zusätzlich gegeben werden sollen
(Gestaltung des e-Parameter des Usercontrol-Events).
In solchen Fällen leitet man eine Klasse von der Eventargs-Klasse ab und fügt
geeignete readonly Eigenschaften hinzu, die im Konstruktor der Klasse (Parameter)
belegt werden. Man kann dabei auch Eigenschaften für die Ruckgabe an das Usercontrol
einbauen (vgl. z.B. die Handled-Eigenschaft der KeyDown-Ereignisse).

Genauere Antworten erfordern genauere Informationen über Deine Absichten.

Beitrag wurde zuletzt am 30.12.23 um 12:48:19 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 30.12.23 13:05

"Wenn ich das richtig verstanden habe, möchtest Du eine Aktion des Anwenders,
die zum Aulösen eines ToolstripButton-Events im Usercontrol geführt hat, als Ereignis
des Usercontrol an das Parent-Formular melden."
Aber dafür gibt es wohl keine Möglichkeit. Auch ein Screenshot wäre eventuell schon hilfreich...

Grüße - Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 30.12.23 13:30

Natürlich funktioniert das.
Ich verstehe nicht, wo Dein Problem liegen könnte.
Erkläre, was genau Dein UserControl leisten soll.


Hier ein Beispielfür ein Usercontrol, das ein BindingNavigator-Control enthält
das mit dem Designer erstellt worden ist.

Public Class BindingControl
 
    Public Event MoveFirst(sender As Object, e As EventArgs)
    Public Event MoveLast(sender As Object, e As EventArgs)
 
    Private Sub BindingNavigatorMoveFirstItem_Click(sender As Object, e As _
      EventArgs) _
        Handles BindingNavigatorMoveFirstItem.Click
 
        RaiseEvent MoveFirst(Me, EventArgs.Empty)
 
    End Sub
 
    Private Sub BindingNavigatorMoveLastItem_Click(sender As Object, e As _
      EventArgs) _
        Handles BindingNavigatorMoveLastItem.Click
 
        RaiseEvent MoveLast(Me, EventArgs.Empty)
    End Sub
 
    'usw ....
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: sv00010
Datum: 30.12.23 15:04

thuring schrieb:
Zitat:

"Wenn ich das richtig verstanden habe, möchtest Du eine
Aktion des Anwenders,
die zum Aulösen eines ToolstripButton-Events im Usercontrol
geführt hat, als Ereignis
des Usercontrol an das Parent-Formular melden."
Aber dafür gibt es wohl keine Möglichkeit. Auch ein
Screenshot wäre eventuell schon hilfreich...

Grüße - Dietrich

Doch die gibt es.
Du kannst dir auch eigene Klassen schreiben, welche von System.EventArgs erben
und dort noch eigene Member hinzufügen.
Der EventHandler und der Delegat müssen dann anstatt vom Standard-Event,
von deiner neuen Klasse sein.
Es gibt auch Konvertierer-Internetseiten mit welchen du den C#-Code in VB.Net
umwandeln kannst.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 30.12.23 15:04

Ooops, mein Text von 13.05 Uhr ist verkürzt, da fehlt ein ganzer Teil...

Deshalb klingt das ein wenig unverständlich. Ich hatte noch geschrieben, dass du mit deinem zitierten Satz genau das erkannt hast, was ich beabsichtige. Und dass das Beschreiben der Problematik eben mit dem Zusenden des designer- und codemäßigen Usercontrols hier im Forum wohl besser zur Klärung beitragen könnte (evtl auch Screenshot).

Aber danke für deine Antwort darauf. Werde ich ebenfalls versuchen.

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 18.01.24 17:44

@ManfredX, 30.12.:
Danke zunächst für den Code.
Beim Probieren hatte ich aber das folgende Problem:
Mein UserControl heißt FileNavigator.
Public Class FileNavigator
Inherits UserControl

Schaue ich mir den Designercode an, steht dort am Anfang
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Partial Class FileNavigator
Inherits UserControl

Wenn ich nun meine Form starte, die das UserControl enthält, erhalte ich bspw. bei
RaiseEvent MoveNext(Me, Nothing)
unter Me Folgendes: FileNavigator.FileNavigator (???) obwohl das Control auf der Form FileNavigator1 heißt.
Das Event MoveNext kann ich in der Form nicht definieren.

Gruß Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 19.01.24 09:01

Hallo!

Es sieht so aius,alshättest Du auf der Form zwei Instanzen des UserControl erstellt.
Eventuell eine im Designer und eine im Code. Eventuell greifst Du auf eine automatisch
veranlasst erstellte Standardinstanz zu (Name der Innstanz = Name der Klasse).

Interne Ereignisse, die das UserControl an die Trägerform (Parent) melden soll,
werden im UserControl (als Public) deklariert und per Raiseevent dort ausgelöst.
Mit Routinen, die per Addhandler oder per Withevents/Handles gekennzeichnet sind,
werden sie in der Form (Parent) verarbeitet.

Wann und wodurch dieses MoveNext-Ereignis ausgelöst werden soll,
solltest Du genauer erklären - nachdem Du die oben erwähnte Mehrfach-Instanziierung
aufgelöst hast.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 19.01.24 12:25

Das User-Control FileNavigator ist bei mir ein Projekt. Da habe ich das Control aus verschiedenen Controls entworfen (insbesondere 4 ToolstripButtons) und entsprechend Code dazu geschrieben. Ich habe das Control noch nicht in eine Form gesetzt.
Hier mal der Code im Control

Public Class FileNavigator
Inherits UserControl

Public Event MoveFirst(sender As Object, e As EventArgs)
Public Event MoveLast(sender As Object, e As EventArgs)
Public Event MovePrevious(sender As Object, e As EventArgs)
Public Event MoveNext(sender As Object, e As EventArgs)
.......
'Hier der Code beim Clicken eines von 4 Buttons

Private Sub PreviousFile_Click(sender As Object, e As EventArgs) _
Handles PreviousFile.Click, NextFile.Click, FirstFile.Click, LastFile.Click
' 4 ToolStripButtons
prevNext(sender.Name)
End Sub

Private Sub prevNext(senderName As String) 'der Name des Buttons wird ausgewertet
btnName = senderName
Select Case btnName
Case "NextFile"
RaiseEvent MoveNext(Me, EventArgs.Empty)
Case "LastFile"
RaiseEvent MoveLast(Me, EventArgs.Empty)
Case "PreviousFile"
RaiseEvent MovePrevious(Me, EventArgs.Empty)
Case "FirstFile"
RaiseEvent MoveFirst(Me, EventArgs.Empty)
End Select
.......
Wenn ich das Projekt starte wird mir das Usercontrol angezeigt, allerdings schon mit dem Namen FileNavigator.FileNavigator.
Klicke ich dann auf einen der Buttons und schaue ich bei der Zeile RaiseEvent nach, was Me ist, kommt eben dieser "Doppelname".
Es gibt keine zweite Instanz...?

Gruß - Dietrich

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 19.01.24 16:46

Hallo!

Der Sender (Objekt) identifiziert das Control (Klasse), von dem das Event ausgelöst worden ist.
In der Name-Eigenschaft kann dem Usercontrol ein Name zugewiesen werden.
Um eine Instanz zu identifizieren kann im Parent-Objekt die Tag-Eigenschaft der
Usercontrol-Instanz belegt werden.

Wenn Du spezifische Informationen durch das Event übergeben willst,
solltest Du von der Klasse Eventargs eine Klasse ableiten, durch deren Eigenschaften
diese Übergabe erfolgt.

Deklaration der Usercontrol-Instanz per Code im Formular:
Dim WithEvents fn As New FileNavigator With {.Parent = Me, .Top = 500, .Height _
  = 250}
Was der Designer bei Dir als Deklaration produziert hat, weiß ich nicht.

Der Eventhandler auf der Form sieht dann z.B. so aus:
Private Sub fn_MoveFirst(sender As Object, e As EventArgs) Handles fn.MoveFirst
'....    
End Sub
Die Handles-Klausel definiert die Zugehörigkeit des Eventhandlers zur Instanz namens "fn".

Beitrag wurde zuletzt am 19.01.24 um 17:07:46 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 24.01.24 16:01

Danke für deinen Beitrag.
Ich habe das Projekt ganz neu aufgesetzt, bekomme allerdings diesen "Doppelnamen" einfach nicht weg und habe keine weitere Idee mehr, was, wo falsch sein könnte...

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: Manfred X
Datum: 24.01.24 17:10

Hallo!

Ich vermute, dass nichts falsch ist.
Angezeigt wird das Projekt und die Klasse des Senders.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: UserControl und Parent-Form 
Autor: thuring
Datum: 30.01.24 09:33

Mittlerweile habe ich gesehen, dass beim FileNavigator-Projekt unter Anwendung bei Stammnamespace auch "FileNavigator" eingetragen war. Das habe ich mal gelöscht. Jetzt kommt bei meiner Aktion als ME wirklich nicht mehr der Doppelname sondern nur noch FileNavigator.
Allerdings lässt sich nun das UserControl via Toolbox nicht mehr auf eine Form setzen. Lässt sich auch dann nicht mehr aus der Toolbox löschen...
Unklar, das Ganze.

Salzburger

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel