DataGridView im ganzen Projekt benutzen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex0815.

    DataGridView im ganzen Projekt benutzen

    Hallo,

    ich habe auf einer UserForm (F_Person_Einstellung) ein DataGridView1, dieses ist verbunden mit einer DataSet (Personen5) Außerdem steht im Designer auch unten in der Leiste ein "PersonenBindingSource" zusätzlich zu dem Dataset mit dem Namen "Personen5"
    In der DataGridView kann ich schön Werte eintragen, speichern etc. und es wird passend die XML erstellt/geschrieben.
    Die F_Person_Einstellung kann ich über einen Button, der sich auf der F_Main befindet, öffnen und die DatGridView wird geladen bzw die XML eingelesen:

    Visual Basic-Quellcode

    1. Public Sub DgvPersonLaden()
    2. F_Person_Einstellungen.Personen5.Clear()
    3. F_Person_Einstellungen.Personen5.ReadXml(F_Main.PfadPersonXML)
    4. End Sub


    Jetzt will ich aber den Inhalt der DataGridView auf der Main anzeigen lassen (bzw. benutzen), eher gesagt will ich Buttonbeschriftungen auf der F_Main anhand der DataGridView Einträge anpassen.

    Wie mache ich das denn am besten, also wie kann ich auf die DataGridView richtigerweise zugreifen, obowhl sie auf einer anderen Form ist und eventuell die Form auch noch nicht geöffnet wurde?!

    Vielen Dank!

    Visual Basic-Quellcode

    1. Private Sub F_Main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. DgvPersonLaden()
    3. Dim ButtonNumber As Integer
    4. Dim ActiveButtonName As String
    5. DgvPersonLaden()
    6. For ButtonNumber = 1 To 10
    7. ActiveButtonName = "b_Person" & ButtonNumber
    8. 'With F_Person_Einstellungen.DataGridView1
    9. For Each control As Control In Me.Controls
    10. If control.Name = ActiveButtonName Then
    11. control.Text = F_Person_Einstellungen.DataGridView1.Rows(4).Cells(1).Value.ToString()
    12. End If
    13. Next
    14. Next
    15. End Sub

    Alex0815 schrieb:

    also wie kann ich auf die DataGridView richtigerweise zugreifen, obowhl sie auf einer anderen Form ist
    Nicht.
    Solch tut man nicht.
    Bestenfalls greift man auf Daten zu, aber nicht auf DatagridViewse.
    Der Slogan heißt "Trennung von Daten und Gui", und diese Trennung beginnt im Kopf.

    Aber auch mit Daten ists problematisch - das ist nämlich vom VisualStudio bisserl fehldesigned.
    Denn man kann ja fabelhaft seine Forms im Designer designen, allerdings entsteht da auf jedem Form eine eigene Dataset-Instanz, und das nix gut.
    Weil das bedeutet redundante Datenhaltung und klar weiß Form1 dann nicht, was der User in Form2 an den Daten zu verändern versucht.

    Lösung: formübergreifendes Databinding - es darf anwendungsweit nur ein Dataset geben, und alle Forms müssen daran angeschlossen werden, und an kein anneres. Daten laden, speichern, verarbeiten - einfachste Variante

    Hi und vielen dank schonmal,

    soweit hat das schon ganz gut geklappt. Was jedoch jetzt nicht funktioniert ist das Abspeichern in die XML über den "buebernehmen" Button, also es wird nur eine fast leere XML erstellt (Ohne Variablen)?!:

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <DataSet1 xmlns="http://tempuri.org/DataSet1.xsd" />


    Button:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports OET.DataSet1
    3. Public Class F_Person_Einstellungen
    4. Private Sub F_Person_Einstellungen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. buebernehmen.Enabled = True
    6. End Sub
    7. Private Sub bZeileloeschen_Click(sender As System.Object, e As System.EventArgs) Handles bZeileloeschen.Click
    8. DataGridView1.Rows.RemoveAt(DataGridView1.CurrentCell.RowIndex)
    9. End Sub
    10. Private Sub buebernehmen_Click(sender As System.Object, e As System.EventArgs) Handles buebernehmen.Click
    11. Me.Validate()
    12. DataSet1.WriteXml(F_Main.PfadPersonXML)
    13. ' DataSet11.WriteXml("personen.xml")
    14. buebernehmen.Enabled = False
    15. End Sub
    16. Private Sub bSchliessen_Click(sender As System.Object, e As System.EventArgs) Handles bSchliessen.Click
    17. Close()
    18. End Sub


    in der F_Main:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports OET.DataSet1
    4. Public Class F_Main
    5. Dim i As Integer
    6. Public PfadPersonXML As String = "personen.xml"
    7. Private Sub F_Main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    8. DataSet1.Clear()
    9. DataSet1.ReadXml(PfadPersonXML)
    10. end sub
    11. Private Sub ÄndernToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles ÄndernToolStripMenuItem.Click
    12. Dim frm As New F_Person_Einstellungen
    13. frm.DataTable1BindingSource.DataSource = Me.DataSet1
    14. frm.Show(Me)
    15. End Sub
    16. End Class






    EDIT:

    So funktioniert es...ist doch OK, oder?

    VB.NET-Quellcode

    1. Private Sub buebernehmen_Click(sender As System.Object, e As System.EventArgs) Handles buebernehmen.Click
    2. Me.Validate()
    3. F_Main.DataSet1.WriteXml(F_Main.PfadPersonXML)
    4. buebernehmen.Enabled = False
    5. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Alex0815“ ()

    Hallo ncohmal,

    auch wenn es jetzt einwenig abdriftet. Die Data Set will ich natürlich noch bearbeiten und Werte abfragen. Dieses mache ich jetzt aktuell so:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. 'TextBox1.Text = DataGridView1.Rows(0).Cells(1).Value.ToString()
    3. Dim ButtonNumber As Integer
    4. Dim ActiveButtonName As String
    5. For ButtonNumber = 1 To Me.DataSet1.DataTable1.Rows.Count - 1
    6. ActiveButtonName = "b_Person" & ButtonNumber
    7. 'With F_Person_Einstellungen.DataGridView1
    8. For Each control As Control In Me.GroupBox1.Controls
    9. If control.Name = ActiveButtonName Then
    10. If Me.DataSet1.DataTable1(ButtonNumber).Name.ToString = "" Then
    11. control.Text = "kein Name eingetragen"
    12. Else
    13. control.Text = Me.DataSet1.DataTable1(ButtonNumber).Name.ToString
    14. End If
    15. End If
    16. Next
    17. Next
    18. End Sub


    Ich will mit den Inhalt in der Spalte "Name", Button auf der F_Main umbenennen. Jetzt habe ich aber in der DataSet (DataGridView) eine Zelle leer, also ein Namen nicht vergeben! Das soll auch theoretisch so möglich sein! Nachdem dann die Schleife da drüber läuft, kommt eine Fehlermeldung aus dem DataSet Designer:

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Property Name() As String
    4. Get
    5. Try
    6. Return CType(Me(Me.tableDataTable1.NameColumn),String)
    7. Catch e As Global.System.InvalidCastException
    8. Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte Name in Tabelle DataTable1 ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set
    12. Me(Me.tableDataTable1.NameColumn) = value
    13. End Set
    14. End Property


    Könnt ihr mir da helfen, wie ich ein leeres Feld zulassen kann?

    Besten Dank!
    ich bin irritiert, dass nach deinen Angaben F_Person_Einstellungen soweit funzt.
    Weil Ich sehe nirgends einen Ansatz formübergreifenden Databindings.
    Stattdessen gibts da wieder die Lösch-Buttons, die im DGV rum-hudeln, grad so als hätte ich nie gesagt, dass man solch nicht tut niemals.

    Aber du hast nu bereits das nächste Thema angefangen - weiß ich erstmal nix zu, weil mir das alles suspekt ist.
    Hi,

    also so ganz verstehe ich deinen Einwand nicht. Die Formübergreifende Databinding geschieht doch im Designer mit der "DataSet" und der "BindingSource" ????
    Das löschen OK, da ist noch ein Bezug auf das DataGridView...ist eine Leiche. Aber der Rest ist doch genau so wie in deinem Programmbeispiel?!?!?
    zurückgezogn - jepp - jetz hab ich die Umstöpselei gesehen :thumbsup:

    Aber es ist unnötig, im F_Personen_Bla auch das Dataset abzuspeichern - das sollte nur im MainForm stattfinden.

    Jut, also zu deim Fehler: Die Exception sagt, bei DbNull kannst du den Namen nicht abrufen, also lass halt.
    Es gibt eine generierte Methode IsNameNull As Boolean - damit musste vorher testen, bevor du den Namen abrufst.

    Aber so langsam könnteste anfangen, den objectbrowser zu benutzen, um deine Dataset-Klassen anzugucken.
    Da hätteste die Methode auch selber finden können.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke für deine Tips bis hier her schon einmal....Ich werde bestimmt noch einige male zurückkomen...;-(

    Ich habe einen neuen Thread erstellt, da es sich ja jetzt doch um etwas anderes handelt:

    IsNameNull Function auf DataSet Tabelle anwenden-WIE???
    Bilder
    • 1.jpg

      532,57 kB, 918×542, 122 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Alex0815“ ()