| |
VB.NET - FortgeschritteneUserControl 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 | |
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 | |
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 | |
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 | |
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. | |
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 | |
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 | |
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. | |
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 | |
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 | |
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. | |
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 | |
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. | |
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 | |
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. | |
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 | |
| 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 |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|