none
Benachrichtigung an Form schicken von einem Benutzersteuerelement (windowsform) RRS feed

  • 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

    Mittwoch, 6. November 2013 11:06

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.


    Mittwoch, 6. November 2013 13:39
    Moderator

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.


    Mittwoch, 6. November 2013 13:39
    Moderator

  • 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

    Mittwoch, 6. November 2013 15:12
  • 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.

    Mittwoch, 6. November 2013 15:16
    Moderator