DataGridView und eine Boolean-Spalte soll nur einmal gewählt sein dürfen

29/04/2010 - 14:00 von Michael Kolowicz | Report spam
Eine Frage, ob es eine "eingebaute" Funktion oder einen einfachen Weg für
folgendes Szenario gibt.

Wir haben eine Kundenverwaltung. Diese soll auch Lieferadressen verwalten
können. Eine Lieferadresse sollte als "Default" gekennzeichnet werden.

Wir haben eine Tabelle mit den Kundendaten und eine verknüpfte Tabelle
mit der Lieferadresse. Darin haben wir eine Spalte "IsDefault" und dem
Typ "Boolean" eingetragen.

Im DGV, in der die Lieferadressen sichtbar werden, wird nun eine Spalte
angezeigt, die ein Kàstchen hat. Nun könnte man das Kàstchen direkt
ausfüllen. Aber es soll sichergestellt sein, dass immer nur EINE Adresse
als "Default" gewàhlt wird. wenn also schon eine Zeile den Eintrag
"Default" hat und man eine andere Zeile "ankreuzt", sollte autm. der
Eintrag in der zuvor markierten Zeile verschwinden.

Gibt's da einen einfachen Weg evtl. über das DGV oder muss man einfach
verhinidern, dass der Benutzer diese Spalte àndern kann und es über
einen gesonderten Dialog machen?

mfg
Michael
 

Lesen sie die antworten

#1 Peter Götz
29/04/2010 - 15:55 | Warnen spam
Hallo Michael,

Wir haben eine Kundenverwaltung. Diese soll auch
Lieferadressen verwalten können. Eine Lieferadresse
sollte als "Default" gekennzeichnet werden.

Wir haben eine Tabelle mit den Kundendaten und
eine verknüpfte Tabelle mit der Lieferadresse. Darin
haben wir eine Spalte "IsDefault" und dem
Typ "Boolean" eingetragen.

Im DGV, in der die Lieferadressen sichtbar werden,
wird nun eine Spalte angezeigt, die ein Kàstchen hat.
Nun könnte man das Kàstchen direkt ausfüllen. Aber
es soll sichergestellt sein, dass immer nur EINE Adresse
als "Default" gewàhlt wird.



Das könnte vom Prinzip her etwa so aussehen:

' /// Code in einer leeren Form
Public Class Form1
Private mDT1 As DataTable
Private mDV1 As DataView
Private mDT2 As DataTable
Private mDV2 As DataView
Private WithEvents DGV As DataGridView
Private WithEvents cboNames As ComboBox
Private WithEvents cBox As CheckBox



Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

CreateControls()

CreateData()

cboNames.DataSource = mDV1

cboNames.DisplayMember = _
mDT1.Columns(1).ColumnName

DGV.DataSource = mDV2
DGV.AutoResizeColumns()
Me.ClientSize = New Size(350, 350)

End Sub

Private Sub CreateControls()
cboNames = New ComboBox
With cboNames
.Font = New Font("Arial", 12)

.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
.Height)

.Name = "cboNames"

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right

End With
Me.Controls.Add(cboNames)

DGV = New DataGridView
With DGV
.DefaultCellStyle.Font = _
cboNames.Font

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

Dim Top As Integer = _
cboNames.Bottom + 30

.SetBounds _
(10, _
cboNames.Bottom + 20, _
cboNames.Width, _
Me.ClientSize.Height - Top)

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(DGV)
End Sub


Private Sub CreateData()
Dim i As Integer
Dim DR1 As DataRow
Dim DR2 As DataRow

Dim Names() As String = _
{"Schulze", "Müller", "Maier", "Schneider", "Schreiner"}

mDT1 = New DataTable
With mDT1
.Columns.Add("ID", GetType(Integer))
.Columns(0).Unique = True
.Columns.Add("Name", GetType(String))

For i = 0 To Names.GetUpperBound(0)
DR1 = .NewRow
DR1.Item(0) = i
DR1.Item(1) = Names(i)
.Rows.Add(DR1)
Next
.AcceptChanges()
End With
mDV1 = New DataView(mDT1)


mDT2 = New DataTable
With mDT2
.Columns.Add("ID", GetType(Integer))
.Columns.Add("SubID", GetType(Integer))
.Columns.Add("Tag", GetType(String))
.Columns.Add("Default", GetType(Boolean))

For Each DR1 In mDT1.Rows
For i = 1 To 7
DR2 = .NewRow
DR2.Item(0) = DR1.Item(0)
DR2.Item(1) = i
DR2.Item(2) = WeekdayName(i, False)
DR2.Item(3) = False
.Rows.Add(DR2)
Next
.AcceptChanges()
Next

End With
mDV2 = New DataView(mDT2)

End Sub


Private Sub cboNames_SelectedIndexChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles cboNames.SelectedIndexChanged

mDV2.RowFilter = _
"ID = " & DirectCast _
(cboNames.SelectedItem, _
DataRowView).Item(0).ToString

DGV.AutoResizeColumns()
End Sub


Private Sub DGV_CellContentClick _
(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs _
) Handles DGV.CellContentClick

Dim dgvr As DataGridViewRow

If e.ColumnIndex = 3 Then

Dim X As Boolean
If DGV.CurrentCell.Value Is DBNull.Value Then
x = False
Else
X = CBool(DGV.CurrentCell.Value)
End If

X = Not X
If X Then
For Each dgvr In DGV.Rows
dgvr.Cells(3).Value = False
Next
End If
End If
End Sub
End Class
' \\\ E N T E

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen