Benutzer mit den meisten Antworten
Benachrichtigung an Form schicken von einem Benutzersteuerelement (windowsform)

Frage
-
Hallo,
ich habe in meiner WindowsForm mehrere Benutzersteuerelemente eingefügt.
Nun ist das so, das wenn im BenutzerSteuerElement1 etwas geändert wurde, ich im BenutzerSteuerElement2 davon wissen muß und entsprechend auch ein paar Sachen ändern soll.
Wie gehe ich ich da am besten vor?
Grüße
Antworten
-
Hallo,
wenn die beiden Controls so fest mit einander arbeiten, lohnt es sich vielleicht die Funktionalitäten der beiden Controls in einem neuen zu kombinieren.Ansonsten kannst du im Control1 ein Event auslösen, welches die Form abfängt. Sobald die Form das Event empfängt, kann Control2 dazu veranlasst werden, seine Daten entsprechend anzupassen. (Daten bekommst von den EventArgs und Control2 ändern geht über eine eigene Methode oder Eigenschaft). Hierzu ein verlürztes Beispiel:
Class Form1 Inherits Form Private c1 As New Control1() Private c2 As New Control2() Public Sub DoSome() AddHandler c1.ReceiveData, AddressOf c1_ReceiveData End Sub Private Sub c1_ReceiveData(sender As Object, e As EventArgs) Me.c2.DoSome() 'mit Daten aus e End Sub End Class Class Control1 Inherits Control Public Event ReceiveData As EventHandler(Of EventArgs) Public Sub ThrowEvent() Me.ReceiveData(Me, New EventArgs()) 'Eigene EventArgs mit Infos üvbergeben End Sub End Class
Das verhählt sich so, wie wenn du auf einen Button klickst und daraufhin im Eventhandler den Text eines anderen Buttons änderst. Bzw. anders herum.
Eventuell kann es sich auch lohnen dem Control2 die Instanz von Control1 mit zugeben. Dadurch kann dann Control2 einfach Me.Control1.DoSome() aufrufen. Von Control1 an Control2 geht das aber dann nicht so einfach, da würde ich auf die Events setzen. Hier noch ein Beispiel dazu:
Class Form1 Inherits Form Private c1 As New Control1() Private c2 As New Control2() Public Sub DoSome() Me.c2.Control1 = Me.c1 'Zuweisung des Controls End Sub End Class Class Control1 Inherits Control Public Sub DoSome(data As String) End Sub End Class Class Control2 Inherits Control Public Property Control1() As Control1 Get Return m_Control1 End Get Set m_Control1 = Value End Set End Property Private m_Control1 As Control1 Public Sub SendDataToForm1(data As String) Me.Control1.DoSome(data) End Sub End Class
Hinweis: Beide Code-Stückchen sind ungetestet. Ich bhabe sie nur schnell zusammen getippt.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Mittwoch, 6. November 2013 14:04 Ergänzung
- Als Antwort markiert sleepy007 Mittwoch, 6. November 2013 15:13
Alle Antworten
-
Hallo,
wenn die beiden Controls so fest mit einander arbeiten, lohnt es sich vielleicht die Funktionalitäten der beiden Controls in einem neuen zu kombinieren.Ansonsten kannst du im Control1 ein Event auslösen, welches die Form abfängt. Sobald die Form das Event empfängt, kann Control2 dazu veranlasst werden, seine Daten entsprechend anzupassen. (Daten bekommst von den EventArgs und Control2 ändern geht über eine eigene Methode oder Eigenschaft). Hierzu ein verlürztes Beispiel:
Class Form1 Inherits Form Private c1 As New Control1() Private c2 As New Control2() Public Sub DoSome() AddHandler c1.ReceiveData, AddressOf c1_ReceiveData End Sub Private Sub c1_ReceiveData(sender As Object, e As EventArgs) Me.c2.DoSome() 'mit Daten aus e End Sub End Class Class Control1 Inherits Control Public Event ReceiveData As EventHandler(Of EventArgs) Public Sub ThrowEvent() Me.ReceiveData(Me, New EventArgs()) 'Eigene EventArgs mit Infos üvbergeben End Sub End Class
Das verhählt sich so, wie wenn du auf einen Button klickst und daraufhin im Eventhandler den Text eines anderen Buttons änderst. Bzw. anders herum.
Eventuell kann es sich auch lohnen dem Control2 die Instanz von Control1 mit zugeben. Dadurch kann dann Control2 einfach Me.Control1.DoSome() aufrufen. Von Control1 an Control2 geht das aber dann nicht so einfach, da würde ich auf die Events setzen. Hier noch ein Beispiel dazu:
Class Form1 Inherits Form Private c1 As New Control1() Private c2 As New Control2() Public Sub DoSome() Me.c2.Control1 = Me.c1 'Zuweisung des Controls End Sub End Class Class Control1 Inherits Control Public Sub DoSome(data As String) End Sub End Class Class Control2 Inherits Control Public Property Control1() As Control1 Get Return m_Control1 End Get Set m_Control1 = Value End Set End Property Private m_Control1 As Control1 Public Sub SendDataToForm1(data As String) Me.Control1.DoSome(data) End Sub End Class
Hinweis: Beide Code-Stückchen sind ungetestet. Ich bhabe sie nur schnell zusammen getippt.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Mittwoch, 6. November 2013 14:04 Ergänzung
- Als Antwort markiert sleepy007 Mittwoch, 6. November 2013 15:13
-
Class Control1 Inherits Control Public Event ReceiveData As EventHandler(Of EventArgs) Public Sub ThrowEvent() Me.ReceiveData(Me, New EventArgs()) 'Eigene EventArgs mit Infos üvbergeben End Sub End Class
Ok, danke, das scheint soweit zuklappen.
Noch als Anmerkung, Aufruf erfolgt über RaiseEvent und nicht über Me. da hat der Compiler gemeckert:
Public Sub ThrowEvent() RaiseEvent ReceiveData(Me, System.EventArgs.Empty) End Sub
Grüße
-
Ich dachte erst ich wäre im C#-Forum und hatte den Code schon zusammen. Naja, da habe ich ihn einfach durch den Konverter geschicht, so sehr schief ging es ja dann auch nicht ;)
Du hast natürlich recht.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.