none
DockPanel Suite Inhalt von WinForm Auslesen RRS feed

  • Frage

  • Hallo

    Wie kann ich den Inhalt von einer WinForm wo in DockPanel geladen ist ausrufen?

    Ich habe das WinForm so in DockPanel Suite geladen

            Dim 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

    Freitag, 27. Januar 2017 13:45

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


    Freitag, 27. Januar 2017 16:36
    Moderator
  • 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

    Samstag, 28. Januar 2017 11:38
    Moderator
  • 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

    Mittwoch, 1. Februar 2017 04:15
  • 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

    Donnerstag, 2. Februar 2017 10:28

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

    Freitag, 27. Januar 2017 15:38
    Beantworter
  • 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

    Freitag, 27. Januar 2017 16:23
  • 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


    Freitag, 27. Januar 2017 16:36
    Moderator
  • 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?

    Freitag, 27. Januar 2017 16:43
  • 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.

    Mehr kann ich nicht sagen...

    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

    Freitag, 27. Januar 2017 16:58
    Moderator
  • PS: Ein etwas vereinfachtes Beispiel findest du hier.

    Leider ist bei Hier keinen Link drin

    Wie müsste mein Code dann aussehen?

    Freitag, 27. Januar 2017 17:04
  • 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

    Freitag, 27. Januar 2017 17:36
    Moderator
  • Public Class Form1
        Private Form2 Formstart_Form2

    Ich komme aber diese meldung (end of-Anweisung erwartet)

    und warum Private müsste es nicht Public sein damit es von außen zugreifen kann

    Freitag, 27. Januar 2017 17:48
  • 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

    Freitag, 27. Januar 2017 23:48
    Moderator
  • 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

    Samstag, 28. Januar 2017 06:26
  • 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?

    Samstag, 28. Januar 2017 09:10
  • 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

    Samstag, 28. Januar 2017 11:38
    Moderator
  • 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?

    Montag, 30. Januar 2017 10:53
  • 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

    Montag, 30. Januar 2017 16:27
    Moderator
  • Sie meinen es dann so oder?

    Public Event MyTextChanged As EventHandler(Of MyString)

    aber da kommt auch ne Fehlermeldung "Der Typ "MyString is nicht definiert"

    Montag, 30. Januar 2017 16:41
  • 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

    Montag, 30. Januar 2017 16:54
    Moderator
  • 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.

    Dienstag, 31. Januar 2017 16:47
  • 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?

    Dienstag, 31. Januar 2017 19:00
  • 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

    Dienstag, 31. Januar 2017 19:38
  • 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

    Dienstag, 31. Januar 2017 21:34
  • 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

    Mittwoch, 1. Februar 2017 04:15
  • 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

    Donnerstag, 2. Februar 2017 10:28