Hallo!
So ganz klar ist mir Dein Problem nicht geworden.
Prinzipiell kommunizieren übergeordnete Klasseninstanzen (z.B. Formulare) mit untergeordneten
Instanzen durch die Zuweisung von Werten auf Properties der untergeordneten Instanz.
Untergeordnete Instanzen kommunizieren durch das Auslösen von Ereignissen, die in der
übergeordneten (erstellenden) Instanz verarbeitet werden können.
Ich habe das in einem Beispiel-Formular (Windows.Forms) zusammengefasst.
Das Formular 'DemoForm' erstellt ein Formular 'Subform1', bei dem Änderungen des Combobox-Index
per Ereignis an das übergeordnete Formular gemeldet werden.
Es wird zugleich ein zweites Formular 'Subform2' erstellt. Änderungen dex cbo-Index in 'Demoform'
werden per Property an 'Subform2' übertragen.
Public Class frmDemo
Dim WithEvents cbo As New ComboBox With {.Parent = Me, .Top = 10, .Left = _
10, .Width = 200,
.DropDownStyle = ComboBoxStyle.DropDownList}
'Datenquelle und Bindung
Dim dic As New Dictionary(Of Integer, String)
Dim bs As New BindingSource
Dim WithEvents btnCreateSubForms As New Button With {.Parent = Me, .Top = _
100, .Width = 200,
.Text = "Erstelle Formular"}
Dim WithEvents Subform1, Subform2 As frmDemo 'untergeordnete Formulare /
' Zugriffsvariablen
Public Event cboindex_changed(ByVal newindex As Integer) 'Ereignis für
' untergeordnetes Formular
Private Sub frmDemo_Load(sender As Object, e As EventArgs) Handles _
MyBase.Load
'Testdaten
With dic
.Add(1, "one") : .Add(2, "two")
.Add(3, "three") : .Add(4, "four")
.Add(5, "five") : .Add(6, "six")
End With
'Datenbindung
bs.DataSource = dic
cbo.DisplayMember = "Value"
cbo.ValueMember = "Key"
cbo.DataSource = bs
Me.Size = New Size(300, 300)
End Sub
Private Sub btnCreateSubForms_Click(sender As Object, e As EventArgs) _
Handles btnCreateSubForms.Click
'Erstellung der untergeordneten Formulare
Subform1 = New frmDemo
With Subform1
.StartPosition = FormStartPosition.Manual
.Top = Me.Top + 100
.Left = Me.Left + 100
.Size = New Size(300, 300)
.Text = "Subform1"
.btnCreateSubForms.Visible = False
.Show()
End With
Subform2 = New frmDemo
With Subform2
.StartPosition = FormStartPosition.Manual
.Top = Me.Top + 200
.Left = Me.Left + 200
.Size = New Size(300, 300)
.Text = "Subform2"
.btnCreateSubForms.Visible = False
.Show()
End With
End Sub
'Im untergeordneten Formular 'subform1/2' wird das Ereignis ausgelöst, das
' die Änderung des cbo-Index mitteilt
'aber nur die Meldung von Subform1 wird in Demoform verarbeitet (siehe
' nächste Routine)
Private Sub cbo_SelectedIndexChanged(sender As Object, e As EventArgs) _
Handles cbo.SelectedIndexChanged
RaiseEvent cboindex_changed(cbo.SelectedIndex)
If Subform2 IsNot Nothing Then
'Übergabe des aktuellen Index an Subform2
Subform2.Comboindex = cbo.SelectedIndex
End If
End Sub
'Im übergeordneten Formular wird Index des untergeordneten Formuars
' 'subform1' übernommen
'Ereignisverarbeitung
Private Sub Subform1_cboindex_changed(newindex As Integer) Handles _
Subform1.cboindex_changed
cbo.SelectedIndex = newindex
End Sub
Public WriteOnly Property Comboindex As Integer
'benötigt in Subform2: Für Übergabe des Index von Demoform
Set(value As Integer)
cbo.SelectedIndex = value
End Set
End Property
End Class |