vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
DGV an dynamische Tabellen binden 
Autor: Bazi
Datum: 13.06.18 13:39

Hallo,
ich möchte in mein Programm die Möglichkeit einbauen dass der Nutzer eigene Listen anlegen und anzeigen kann.
Ich dachte nun daran im Dataset eine Tabelle "EigeneListe" anzulegen, dazu eine Tabelle "EigeneListeSpalten" und darunter hängend eine Tabelle "EigeneListeWerte".

Nun stelle ich mir die Frage wie bekomme ich das im DGV angezeigt und Änderungen abgespeichert?

Zum Anzeigen denke ich müsste ich ein DataTable erstellen und mit den Spaltennamen aus "EigenListeSpalten" die Spalten befüllen, danach mit den "EigeneListeWerte" die Werte unter die entsprechenden Spalten eintragen.

Zum Rückspeichern dann quasi andersrum.

Geht das vlt. auch einfacher?

Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Manfred X
Datum: 13.06.18 14:51

Hallo!

Es wäre zu klären, welche Funktionalität Du dem
Benutzer zur Verfügung stellen willst, z.B.
Soll er spezifische Datentypen für seine Spalten festlegen können?
Soll er Validierungskriterien für die Eingaben definieren können?
Tabellenverknüpfungen?

Wie soll gespeichert werden? XML-, CSV-Datei?, eigene Datenbank anlegen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Bazi
Datum: 13.06.18 14:58

Hallo,
der Nutzer soll Tabellen anlegen können und zu jeder Tabelle Spalten definieren. Datentpyen für Spalten wäre gut, es ginge aber auch alles über String zu handeln.

Validierungskriterien habe ich mir noch keine Gedanken gemacht. Wenn ein Datentyp festgelegt ist lässt doch das DGV nur die entsprechende Eingabe zu?

Verknüpfung hatte ich mir gedacht

EigeneListe, hat eine IDString als Primärschlüssel,
EigeneListeSpalten ist mit Column EigeneListeID mit diesem Verknüpft und hat selber wieden ein IDString der dann mit der EigeneListeWerte verknüpft ist. Somit werden die Werte immer einer Spalte zugeordnet.

Gespeichert wird in einer XML-Datei. Zu einem späteren Zeitpunkt möchte ich das ganze Programm auf eine SQLight umstellen.

Gruß Christian
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Manfred X
Datum: 13.06.18 15:17

Hallo!

Stringspalten bieten keine Eingabe-Restriktion, weil sie
jede Zeicheneingabe akzeptieren.

Eine derartige Tabelle macht auch kaum Sinn, weil man einfacher
eine Textbox nutzen kann, in der die Felder durch Strichpunkt
getrennt und die Zeilen durch Zeilenvorschub kenntlich gemacht werden.

Auch Validierungen sind meines Erachtens erforderlich.
Die Festlegung eines Datentyps schafft noch keine inhaltliche Begrenzung.
Alter in Jahren = 1000 ????

Die Primärschlüssel-Spalte sollte programmgesteuert verwaltet werden,
um UNIQUE-Einträge sicherzustellen.
Verknüpfungen mit anderen Tabellen (Fremdschlüssel) müssen ebenfalls
vom Benutzer definiert und dann programmgesteuert überwacht werden.

Und im Hinblick auf die Einbettung in das Datenbank-Management sind weitere
Fragen zu überlegen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Bazi
Datum: 13.06.18 15:47

Hallo,
die Primärschlüssel werden programmgesteuert vergeben, Validierungen wie z.B. Alter = 1000 kann ich im Vorfeld nicht abfangen. Ich möchte ja die Möglichkeit geben nach belieben Spalten hinzuzufügen. Da ich dann keine Kentniss habe was darin gespeichert wird kann ich es nicht validieren. Lediglich falsche Eingaben zum Datentyp kann ich abfangen.

Ich probier mal ein bischen rum.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Manfred X
Datum: 13.06.18 15:55

Hier ein einfaches Beispiel für freie Spaltendefinition mit
programmgesteuertem Schlüssel.
Wenn Du beim Erstellen einer numerischen oder Date-Spalte die
zulässige Spannweite oder beim Erstellen einer Stringspalte z.B. die
zulässige Länge abfragst und speicherst, kannst Du diese Restriktionen
in den Validierungsevents des Grid nutzen.
Public Class frmCreateTable
 
    Dim WithEvents dt As New DataTable
 
    Dim lblCreateColumn As New Label With
        {.Parent = Me, .Text = "  Spalte erstellen: ", _
         .AutoSize = False, .Width = 120}
    Dim WithEvents cboCreateColumn As New ComboBox With
        {.Parent = Me, .Left = 125, _
         .DropDownStyle = ComboBoxStyle.DropDownList}
 
 
    Dim WithEvents dgv As New DataGridView With _
        {.Parent = Me, .Top = 40, .Width = 400}
 
 
    Private Sub frmCreateTable_Load(sender As Object, _
        e As EventArgs) Handles MyBase.Load
        With cboCreateColumn.Items
            .Add("Boolean")
            .Add("Integer")
            .Add("Decimal")
            .Add("Bitmap")
            .Add("String")
        End With
        cboCreateColumn.SelectedIndex = 0
 
        Dim dc As DataColumn = dt.Columns.Add("Key", GetType(Integer))
        dc.ReadOnly = True
    End Sub
 
 
    Private Sub AddColumn()
 
        Dim cn As String = _
           InputBox("Bezeichnung der Spalte", "Spalte erstellen", "")
        If String.IsNullOrWhiteSpace(cn) Then Exit Sub
        If dt.Columns.Contains(cn) Then Exit Sub
 
        Dim r1 As DialogResult = DialogResult.No
        If dt.Rows.Count = 0 Then
            r1 = MsgBox _
              ("Spalte " & cn & "   Nullwerte zulassen?", MsgBoxStyle.YesNo)
        End If
 
        Dim r2 As DialogResult =
            MsgBox _
            ("Spalte " & cn & "   Eindeutige Werte notwendig?", _
            MsgBoxStyle.YesNo)
 
        Dim dc As DataColumn
        With dt.Columns
            Select Case cboCreateColumn.SelectedItem
                Case "Boolean"
                    dc = .Add(cn, GetType(Boolean))
                Case "Integer"
                    dc = .Add(cn, GetType(Integer))
                Case "Decimal"
                    dc = .Add(cn, GetType(Decimal))
                Case "Bitmap"
                    dc = .Add(cn, GetType(Bitmap))
                Case Else
                    dc = .Add(cn, GetType(String))
            End Select
        End With
 
        dc.AllowDBNull = r1 = DialogResult.Yes
        dc.Unique = r2 = DialogResult.Yes
        dgv.DataSource = dt
    End Sub
 
 
    Private Sub cboCreateColumn_DropDownClosed(sender As Object, e As _
      EventArgs) _
        Handles cboCreateColumn.DropDownClosed
        AddColumn()
    End Sub
 
 
    Private Sub dgv_DataError(sender As Object, e As _
      DataGridViewDataErrorEventArgs) _
        Handles dgv.DataError
 
        MsgBox(e.Exception.Message)
        e.Cancel = True
    End Sub
 
 
    Private Sub dt_TableNewRow(sender As Object, e As DataTableNewRowEventArgs) _
        Handles dt.TableNewRow
 
        If dt.Rows.Count = 0 Then
            e.Row.Item(0) = 1
        Else
            Dim k As Integer = 0
            For i As Integer = 0 To dt.Rows.Count - 1
                k = Math.Max(k, CInt(dt.Rows(i).Item(0)))
            Next i
            k += 1
            e.Row(0) = k
        End If
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Bazi
Datum: 13.06.18 18:53

Hallo,
das hilft mir schon viel weiter, aber wie speichere ich das in meinem bestehenden DataSet das via LoadXml geladen und via WriteXml gespeichert wird?
Selbst wenn die DataTable im WriteXml mit ausgegeben wird, dann wird sie ja beim Laden nicht befüllt weil sie nicht da ist.

Ich glaube ich brauche eine Lösung wo ich DataTables im Dataset erstelle und der Anwender die Möglichkeit hat beliebig viele Spalten und Werte dazu abzuspeichern.
Daher mein Ansatz mit den 3 Tabellen.

Oder habe ich da einen Denkfehler?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Manfred X
Datum: 13.06.18 21:10

Hallo!

XML-Dateien sind einfache Textdateien,
die gefüllt und gelesen werden.
Tabellen kannst Du einfach einfügen und das Dataset speichern.
Beim Laden werden die Tabellen aus den gespeicherten Schemaangaben
automatisch erstellt.

Hier ein Beispiel:
Public Sub TableAdd()
 
        Dim xmlfile As String = "G:\daten\xml_Dataset.xml"
 
        'Ein Dataset mit einer Tabelle (10 Datensätze) erstellen
        Dim ds As New DataSet
        Dim dt As New DataTable With {.TableName = "Tab1"}
        dt.Columns.Add("Sp1", GetType(Integer))
        For i As Integer = 1 To 10
            dt.Rows.Add(i)
        Next i
        ds.Tables.Add(dt)
 
        'Dataset speichern
        ds.WriteXml(xmlfile, XmlWriteMode.WriteSchema)
 
        'Neues Dataset erstellen und mit gespeicherten 
        'Daten und Schema füllen
        Dim ds2 As New DataSet
        ds2.ReadXml(xmlfile, XmlReadMode.ReadSchema)
 
        'eine weitere Tabelle erstellen 
        'und in das Dataset einfügen
        Dim dt2 As New DataTable With {.TableName = "Tab2"}
        dt2.Columns.Add("Tab2_Sp1", GetType(Integer))
        For i As Integer = 1 To 20
            dt2.Rows.Add(10 - i)
        Next i
 
        'Dataset jetzt mit 2 Tabellen speichern 
        ds2.Tables.Add(dt2)
        ds2.WriteXml(xmlfile, XmlWriteMode.WriteSchema)
 
        'Daten und Schema im ersten Dataset löschen und laden
        ds.Tables.Clear()
        ds.ReadXml(xmlfile, XmlReadMode.ReadSchema)
 
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Bazi
Datum: 13.06.18 22:27

Die Überladung mit XmlReadMode und XmlWriteMode kannte ich nocht nicht.

Dass ich das DataSet bisher im Designer erstellt habe dürfte da nichts ausmachen.
Ich probiere das morgen aus.

Danke

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DGV an dynamische Tabellen binden 
Autor: Manfred X
Datum: 14.06.18 10:57

Ein typisiertes Dataset wird im Designer erstellt, damit automatisch Klassen
gebildet werden, über die man DANACH im Code der Anwendung per Klassen-Properties
auf die geladenen Daten zugreifen kann.

Werden Tabellen erst zur Laufzeit erstellt, kann nicht typisiert gearbeitet
werden. (Naja, machbar ist irgendwie alles ...)

Neue Tabellen müssen gemäß Benutzereingaben in der Datenbank angelegt werden.
Zu diesem Zweck sind SQL-Kommandos erforderlich, die aus den Angaben zusammen-
montiert werden (Spaltentypen, PrimärSchlüsselspalte(n), Fremdschlüsselspalte(n)).
Bereits in der DB vorhandene Tabellen müssen per SQL-Kommando/Parameter untypisiert
in ein Dataset geladen werden.

Beitrag wurde zuletzt am 14.06.18 um 10:59:16 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel