Benutzer mit den meisten Antworten
DockPanel Suite Inhalt von WinForm Auslesen

Frage
-
Hallo
Wie kann ich den Inhalt von einer WinForm wo in DockPanel geladen ist ausrufen?
Ich habe das WinForm so in DockPanel Suite geladenDim Formstart As New Form2 Formstart.Show(DockPanel1, DockState.Document)
Nun möchte ich mit einem anderen WinForm das auch in den DockPanel1 geladen wird den Inhalt einer Textbox von Form2 auslesen.
Leider bekomme ich den Inhalt nicht
Ich hab es so versucht aber es geht Leider nicht.Label1.text = form2.textbox1.text
Wenn die Formen nicht in DockPanel Suite lade dann geht es.
Wie kann man das Lösen?Gruß
Matthias
Antworten
-
Hallo Matthias,
das Eleganteste ist es, wenn du in Form3 ein Event erstellst, welches du beim Button-Klick auslöst. In Form1 hast du wiederum das Event abonniert und kannst dann dort auf die Form-Instanzen zugreifen. Dafür musst du die Variablen aber in die Klasse verschieben!
Public Class Form1 Private Form2 Formstart_Form2 'usw. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Formstart_Form2 = New Form2 Formstart_Form2.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft) 'usw.
Dann kannst du in dem Eventhandler eine Methode aus Form2 aufrufen der den Text zurück gibt und diesen String kannst du dann wieder über eine Methode an Form4 übergeben. Wobei du hier statt Methoden auch Eigenschaften nutzen kannst.
Du darfst aber nie einfach nur Form2 o.ä. schreiben, weil dann (wie Elmar schon schrieb) immer eine neue Instanz der Klasse angelegt wird.
PS: Ein etwas vereinfachtes Beispiel findest du hier. Dort ist allerdings der Button auf der selben Seite wie die TextBox. Das Label befindet sich trotzdem auf einer anderen Form.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Bearbeitet Tom Lambert (Koopakiller)Moderator Freitag, 27. Januar 2017 16:50 PS
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Januar 2017 10:37
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:00
-
Hallo Matthias,
wenn du einfach nur mein Projekt öffnest sollte das Problem nicht kommen. Denn es liegt vermutlich daran, dass du eine ältere Frameworkversion verwendest. EventHandler(Of T) akzeptiert als T soweit ich weiß erst seit .NET 4.5 alles und nicht nur von EventArgs abgeleitete Typen. Das zweit-einfachste wäre hier wohl noch eine Klasse dazwischen zu setzen.
Public Class MyEventArgs Inherits EventArgs Public Property MyString As String End Class
Diese musst du dann anstelle des Strings übergeben. In der Klasseninstanz, in der Eigenschaft sollte natürlich der String stehen. Das ist damit etwas komplexer, funktioniert grundsätzlich aber genauso.
Das einfachste Lösung wäre die Framework Version auf die neueste (4.6....) zu stellen. Aber natürlich nur, wenn das bei dir keine Probleme macht.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Januar 2017 10:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:01
-
Hi,
bei Deiner Aufgabenstellung benötigst Du keinen Modul mit Verweis auf Forms. Lasse jede Form als Kapsel für sich, erzeuge eine Instanz bei Bedarf und zeige sie an. Die erzeugte Instanz holt sich dann die Daten für die Anzeige aus einem Datenpuffer, der statisch ist (d.h., sich im Modul befindet).Dazu eine kleine Demo, die ohne Designer per Code alles selbst erzeugt. Kopiere die Demo in ein Projekt und setze entsprechend das Startformular. In der Demo werden in einem Modul Daten erzeugt und bereitgestellt, die dann durch unterschiedliche Forms angezeigt werden.
Public Class Form26 ' DateGridView in Form1 Private dgv As New DataGridView With {.Dock = DockStyle.Fill} Private Sub Form26_Load(sender As Object, e As EventArgs) Handles Me.Load dgv.DataSource = Modul26.BS1 Me.Controls.Add(dgv) AddHandler dgv.Click, Sub() Call (New Form26_2).Show() End Sub End Sub End Class Public Class Form26_2 Inherits Form ' DateGridView in Form2 Private dgv As New DataGridView With {.Dock = DockStyle.Fill} Private Sub Form26_Load(sender As Object, e As EventArgs) Handles Me.Load dgv.DataSource = Modul26.BS2 Me.Controls.Add(dgv) End Sub End Class Public Module Modul26 Friend DS As New DataSet ' Datenpuffer Friend BS1 As New BindingSource ' Datenquelle Master-Tabelle Friend BS2 As New BindingSource ' Datenquelle Child-Tabelle Sub New() ' DataSet laden With DS ' Tabelle 1 (Master-Tabelle) With .Tables.Add("Tab1") ' Spalten der Tabelle 1 With .Columns .Add("ID", GetType(Integer)) .Add("Info1", GetType(String)) End With ' Datensätze in Tabelle 1 For i = 1 To 10 Dim r = .NewRow() r(0) = i r(1) = $"Zeile {i}" .Rows.Add(r) Next End With ' Tabelle 2 (Child-Tabelle) With .Tables.Add("Tab2") ' Spalten der Tabelle 2 With .Columns .Add("ID", GetType(Integer)) .Add("FK", GetType(Integer)) ' Fremdschlüssel .Add("Info2", GetType(String)) End With ' Datensätze in Tabelle 2 For i = 1 To 99 Dim r = .NewRow() r(0) = i r(1) = Math.Floor(i / 10 + 1) r(2) = $"Zeile {i}" .Rows.Add(r) Next End With ' Beziehung der Tabellen .Relations.Add("Rel1", DS.Tables("Tab1").Columns(0), DS.Tables("Tab2").Columns(1)) End With ' Datenquelle für Master-Tabelle BS1.DataSource = DS BS1.DataMember = "Tab1" ' Datenquelle für Datensätze der Child-Tabelle für in Mastertabelle ausgewählten Datensatz BS2.DataSource = BS1 BS2.DataMember = "Rel1" End Sub End Module
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:03
-
Hallo
Ich habe gerade eine Lösung gefunden
Ich hab in Form1 in Designer Code das eingefügt
Friend WithEvents Formstart_Form2 As New Form2
Somit kann ich über Formstart_Form2 auf alles zugreifen.
Meine frage ist nun wird sowas auch verwendet oder soll man sowas lieber vermeiden?
Gruß
Matthias
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:03
Alle Antworten
-
Hallo Matthias,
verwende Formstart (nicht Form2). Die Instanz sollte als Klassenvariable gespeichert sein, so dass sie während der Laufzeit zugänglich ist.
Hintergrund: Form2 erzeugt in Visual Basic eine Standard-Instanz für ein Formular, die isoliert ist. Und nichts mit der an das Dockpanel übergebenen Instanz zu tun hat. Darauf sollte man allgemein (nicht nur mit DockPanel) verzichten. Andere Umgebungen (wie C#) haben eh und je darauf verzichtet.
Mit https://media.readthedocs.org/pdf/dockpanelsuite/latest/dockpanelsuite.pdf findet sich eine umfassendere Dokumentation, leider nur mit Codebeispielen in C#.
Gruß Elmar
-
Ich hab jetzt mal ein kleines Beispiel gemacht
In Form1 hab ich das DockPanel Suite eingefügt
beim Form Load sieht das so aus
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim Formstart_Form2 As New Form2 Formstart_Form2.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft) Dim Formstart_Form3 As New Form3 Formstart_Form3.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.Document) Dim Formstart_Form4 As New Form4 Formstart_Form4.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockRight) End Sub End Class
Im Form2 habe ich nur eine TextBox
Im Form3 habe ich ein Button
Im Form4 habe ich ein Label
Nun möchte ich wenn ich im Form3 auf den Button Klicke das der Text in Form2 in das Label von Form4 geschrieben wird
Hier der Code von Form3 Button
Public Class Form3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Form4.Label1.Text = Form2.TextBox1.Text End Sub End Class
Formstart_Form2 kann ich nicht benutzen da es noch nicht vorhanden ist und mir dann den Fehler anzeigt
Wie kann man sowas Lösen?
Gruß
Matthias
-
Hallo Matthias,
das Eleganteste ist es, wenn du in Form3 ein Event erstellst, welches du beim Button-Klick auslöst. In Form1 hast du wiederum das Event abonniert und kannst dann dort auf die Form-Instanzen zugreifen. Dafür musst du die Variablen aber in die Klasse verschieben!
Public Class Form1 Private Form2 Formstart_Form2 'usw. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Formstart_Form2 = New Form2 Formstart_Form2.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft) 'usw.
Dann kannst du in dem Eventhandler eine Methode aus Form2 aufrufen der den Text zurück gibt und diesen String kannst du dann wieder über eine Methode an Form4 übergeben. Wobei du hier statt Methoden auch Eigenschaften nutzen kannst.
Du darfst aber nie einfach nur Form2 o.ä. schreiben, weil dann (wie Elmar schon schrieb) immer eine neue Instanz der Klasse angelegt wird.
PS: Ein etwas vereinfachtes Beispiel findest du hier. Dort ist allerdings der Button auf der selben Seite wie die TextBox. Das Label befindet sich trotzdem auf einer anderen Form.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Bearbeitet Tom Lambert (Koopakiller)Moderator Freitag, 27. Januar 2017 16:50 PS
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Januar 2017 10:37
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:00
-
Ich hab es mal so geändert
Form1
Public Class Form1 Dim Formstart_Form2 As New Form2 Dim Formstart_Form3 As New Form3 Dim Formstart_Form4 As New Form4 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Formstart_Form2.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft) Formstart_Form3.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.Document) Formstart_Form4.Show(DockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockRight) End Sub End Class
Dann hab ich versucht in Form3 mit den Button1 versucht
Public Class Form3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Form1.Formstart_Form4.Label1.text = Form1.Formstart_Form2.TextBox1.text End Sub End Class
Leider kommt diese Meldung ("Form1.Formstart_Form4" ist "Private" und in diesem Kontext nicht zugreifbar.)
obwohl die Dim jetzt in Public drin stehen
Was hab ich Falsch?
-
Du darfst aber nie einfach nur Form2 o.ä. schreiben, weil dann (wie Elmar schon schrieb) immer eine neue Instanz der Klasse angelegt wird.
PS: Ein etwas vereinfachtes Beispiel findest du hier. Dort ist allerdings der Button auf der selben Seite wie die TextBox. Das Label befindet sich trotzdem auf einer anderen Form.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub -
Das war ein Zitat, den Link findest du in dem Original, die Antwort eins weiter oben. Wie dein Code aussehen muss habe ich dir bereits geschrieben. Das Beispiel soll nur grob die Richtung zeigen.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub -
Ach bitte...dass ich nicht alles notwendige nieder geschrieben ahbe sollte wohl offensichtlich sein. Spätestens bei den "'usw.".
Und du sollst ja nicht von außen drauf Zugreifen...du kannst das natürlich trotzdem machen, das ist dann aber eben kein sonderlich schöner Stil weil sich alle Klassen Gegenseitig kennen müssen. In meiner Lösung übernimmt Form1 sämtliche Kommunikationsarbeit, daher sind die Felder auch Private.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub -
Hi Matthias,
lies Dir bitte nochmals Elmars Beitrag durch. Wenn Du in VB.NET die Standard-Einstellungen nutzt:dann wird beim Programmstart automatisch eine Instanz für jede Form mit gleichem Namen der deklarierten Klasse erstellt. Diesen kann man nutzen. Das kann aber sehr irritierend sein. Besser ist es, selbst alles explizit zu machen, wie Du es bereits angefangen hast, d.h. eigene Instanzen erzeugen. Um dann gegenseitig auf die Instanzen zugreifen zu können, benötigst Du den Verweis auf die Instanz, auf die Du zugreifen willst. In VB.NET kannst Du das als Anfänger über einen Modul erreichen. Deklariere die Variablen in einem Modul. Dann kannst Du von überall darauf zugreifen, da die Member im Modul automatisch statisch sind, d.h. einmalig über die gesamte Laufzeit des Programmes. Das ist zwar kein besonders guter Stil, für einen Anfänger und kleine Programme aber entschuldbar.
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Module1.Formstart_Form2.Show() Module1.Formstart_Form2.....Zugriff auf Innereien End Sub End Class Module Module1 Public Formstart_Form2 As New Form2 Public Formstart_Form3 As New Form3 Public Formstart_Form4 As New Form4 End Module
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Januar 2017 10:50
-
Danke für die Beispiele
Ich Teste grad das Beispiel von Tom
Ich hab dabei ein Problem in FormB
Public Event MyTextChanged As EventHandler(Of String)
Das String wird rot unterstrichen
(Stellt Text als eine Reihe von UniCode-Zeichen dar. Das Typargument "Sting" erbt nicht vom Einschränkungstyp "EventArgs" bzw. implementiert diesen nicht.)
Was hab ich vergessen?
-
Hallo Matthias,
wenn du einfach nur mein Projekt öffnest sollte das Problem nicht kommen. Denn es liegt vermutlich daran, dass du eine ältere Frameworkversion verwendest. EventHandler(Of T) akzeptiert als T soweit ich weiß erst seit .NET 4.5 alles und nicht nur von EventArgs abgeleitete Typen. Das zweit-einfachste wäre hier wohl noch eine Klasse dazwischen zu setzen.
Public Class MyEventArgs Inherits EventArgs Public Property MyString As String End Class
Diese musst du dann anstelle des Strings übergeben. In der Klasseninstanz, in der Eigenschaft sollte natürlich der String stehen. Das ist damit etwas komplexer, funktioniert grundsätzlich aber genauso.
Das einfachste Lösung wäre die Framework Version auf die neueste (4.6....) zu stellen. Aber natürlich nur, wenn das bei dir keine Probleme macht.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 31. Januar 2017 10:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:01
-
Sorry hatte vergessen zu sagen das ich Framework 4.0 verwende
Ich hab nun das so geändert
Public Class FormB Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click RaiseEvent MyTextChanged(Me, TextBox1.Text) End Sub Public Event MyTextChanged As EventHandler(Of MyEventArgs) Public Class MyEventArgs Inherits EventArgs Public Property MyString As String End Class
nun kommt die Meldung bei Textbox1.text
(Der Wert vom Typ "String" kann nicht in "FormB.MyEventArgs" konvertiert werden.)
Wie muss ich die Zeile
RaiseEvent MyTextChanged(Me, TextBox1.Text)
ändern?
-
Wenn sich der Event-Typ von EventHandler (Of String) in EventHandler(Of MyEventArgs) umändert, dann musst du auch entsprechend ein MyEventArgs-Objekt übergeben. Dieses musst du neu anlegen und der MyString-Eigenschaft den zu übergebenden String aus der TextBox zuweisen.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub -
Nein, das habe ich auch nicht geschrieben.
Ich habe mein Beispiel auf GitHub abgeändert, dort findet du jetzt Code der zu .NET 4.0 kompatibel ist.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub -
Wie läuft jetzt das mit Datagridview ab?
Ich habe die Abfrage von Datagridview so
Private Sub DGV1_SelectionChanged(sender As Object, e As EventArgs) Handles DGV1.SelectionChanged Dim selectedCellCount As Integer = DGV1.GetCellCount(DataGridViewElementStates.Selected) If selectedCellCount > 0 Then If DGV1.AreAllCellsSelected(True) Then MessageBox.Show("All cells are selected", "Selected Cells") Else Dim sb As New System.Text.StringBuilder() Dim rowauswahl As Integer Dim i As Integer For i = 0 To selectedCellCount - 1 rowauswahl = DGV1.SelectedCells(i).RowIndex.ToString() Next i Daten.Text_Label1 = DGV1.Rows(rowauswahl).Cells(0).Value Daten.Text_Label2 = DGV1.Rows(rowauswahl).Cells(1).Value End If End If End Sub
Habe eine Klasse erstellt mit dem Inhalt
Public Shared Text_Label1 As String Public Shared Text_Label2 As String
Nun möchte ich das diese Daten automatisch auf den FormA es Automatisch in Label angezeigt wird.
-
Ich hab das mal mit dem Modul probiert.
Hab in Modul1 das eingefügt
Module Module1 Public Formstart_Form2 As New Form2 Public Formstart_Form3 As New Form3 Public Formstart_Form4 As New Form4 End Module
Das geht dann zwar ohne Probleme aber Leider lässt sich das nur 1mal Starten.
wenn man das Form beendet und dann wieder öffnen will hängt sich das Programm auf.
Warum ist das so und was kann man da tun?
-
Hi,
mit dem New im Modul wird eine Instanz erzeugt. Mit dem Beenden der Form wird dieses Objekt inkonsistent ist nicht mehr nutzbar. Wenn Du dieses Objekt nochmals nutzen willst, darfst Du es nicht beenden, sondern musst es nur "verstecken" (Hide). Wenn Du dagegen ein neues Form-Objekt benötigst, darf das New nicht im Modul stehen, sondern an der Stelle, wo im Programmablauf die Instanz erzeugt und angezeigt werden soll.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Ich hab das auch so Probiert
Module Module1 Public Formstart_Form2 As Form2 Public Formstart_Form3 As Form3 Public Formstart_Form4 As Form4 End Module
und im Form
Formstart_Form2 = New Form2 Formstart_Form2.Show(DockPanel2, DockState.Document)
usw.
Aber leider funktioniert es dann nicht mehr
Mein Problem ist ich mochte in Datagridview eine Liste anzeugen lassen.
Wenn ich bei Datagridview eins auswähle wird ein Form mit diese 3 Formen geladen. Das heißt das es immer wieder geöffnet wird oder sogar mal 2mal oder 3mal geöffnet wird.
in form3 ist auch wieder ein Datagridview und da soll des Markierten Zeile von Datagridview in Form4 angezeigt wird.
in Form2 sind die Inhalte von dem ersten Datagridview drin.
Links Form2 in der Mitte Form3 und Rechts Form4
Ich hoffe ich konnte es gut erklären
-
Hi,
bei Deiner Aufgabenstellung benötigst Du keinen Modul mit Verweis auf Forms. Lasse jede Form als Kapsel für sich, erzeuge eine Instanz bei Bedarf und zeige sie an. Die erzeugte Instanz holt sich dann die Daten für die Anzeige aus einem Datenpuffer, der statisch ist (d.h., sich im Modul befindet).Dazu eine kleine Demo, die ohne Designer per Code alles selbst erzeugt. Kopiere die Demo in ein Projekt und setze entsprechend das Startformular. In der Demo werden in einem Modul Daten erzeugt und bereitgestellt, die dann durch unterschiedliche Forms angezeigt werden.
Public Class Form26 ' DateGridView in Form1 Private dgv As New DataGridView With {.Dock = DockStyle.Fill} Private Sub Form26_Load(sender As Object, e As EventArgs) Handles Me.Load dgv.DataSource = Modul26.BS1 Me.Controls.Add(dgv) AddHandler dgv.Click, Sub() Call (New Form26_2).Show() End Sub End Sub End Class Public Class Form26_2 Inherits Form ' DateGridView in Form2 Private dgv As New DataGridView With {.Dock = DockStyle.Fill} Private Sub Form26_Load(sender As Object, e As EventArgs) Handles Me.Load dgv.DataSource = Modul26.BS2 Me.Controls.Add(dgv) End Sub End Class Public Module Modul26 Friend DS As New DataSet ' Datenpuffer Friend BS1 As New BindingSource ' Datenquelle Master-Tabelle Friend BS2 As New BindingSource ' Datenquelle Child-Tabelle Sub New() ' DataSet laden With DS ' Tabelle 1 (Master-Tabelle) With .Tables.Add("Tab1") ' Spalten der Tabelle 1 With .Columns .Add("ID", GetType(Integer)) .Add("Info1", GetType(String)) End With ' Datensätze in Tabelle 1 For i = 1 To 10 Dim r = .NewRow() r(0) = i r(1) = $"Zeile {i}" .Rows.Add(r) Next End With ' Tabelle 2 (Child-Tabelle) With .Tables.Add("Tab2") ' Spalten der Tabelle 2 With .Columns .Add("ID", GetType(Integer)) .Add("FK", GetType(Integer)) ' Fremdschlüssel .Add("Info2", GetType(String)) End With ' Datensätze in Tabelle 2 For i = 1 To 99 Dim r = .NewRow() r(0) = i r(1) = Math.Floor(i / 10 + 1) r(2) = $"Zeile {i}" .Rows.Add(r) Next End With ' Beziehung der Tabellen .Relations.Add("Rel1", DS.Tables("Tab1").Columns(0), DS.Tables("Tab2").Columns(1)) End With ' Datenquelle für Master-Tabelle BS1.DataSource = DS BS1.DataMember = "Tab1" ' Datenquelle für Datensätze der Child-Tabelle für in Mastertabelle ausgewählten Datensatz BS2.DataSource = BS1 BS2.DataMember = "Rel1" End Sub End Module
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:03
-
Hallo
Ich habe gerade eine Lösung gefunden
Ich hab in Form1 in Designer Code das eingefügt
Friend WithEvents Formstart_Form2 As New Form2
Somit kann ich über Formstart_Form2 auf alles zugreifen.
Meine frage ist nun wird sowas auch verwendet oder soll man sowas lieber vermeiden?
Gruß
Matthias
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 7. Februar 2017 12:03