| |
ADO.NET / DatenbankenDGV 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 | |
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? | |
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 | |
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. | |
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 | |
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 | |
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 | |
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 | |
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 | |
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. | |
| 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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|