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 |