Ich dachte eigentlich nun über den Berg zu sein, da es mit einem BindingSource wunderbar funktioniert hat, sobald aber ein zweites dazukommt, stimmt nichts mehr.
Die DataTable mit den Werten aus der Datenbank ist global. Wenn ich diese DataTable nun bei zwei verschiedenen BindingSources als DataSource verwende (bindingsource.datasource = datatable), dann scheint es so als würde der Filter der einen BindingSource den anderen überschreiben, denn plötzlich wird das Grid leer. Verwende ich stattdessen bindingsource.datasource = datatable.defaultview.totable(), dann sind beide scheinbar unabhängig voneinander.
Klicke ich nun auf eine Zeile im DataGridView mit allen Datensätzen, dann verschwindet diese Zeile auch aus dem DataGridView, es taucht aber nicht im DataGridView des entsprechenden Tabs auf.
Ich habe mal den nötigsten Code extrahiert, evtl. sieht jemand darin den Fehler:
Private dtData As DataTable
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Dim bsArtikel As BindingSource
dtData = sqlDataTable("SELECT AR_Nummer, AR_Bezeichnung FROM Artikel")
dtData.Columns.Add("AR_Gruppe", GetType(String))
bsArtikel = New BindingSource
bsArtikel.DataSource = dtData.DefaultView.ToTable
bsArtikel.Filter = getFilter()
DataGridView1.DataSource = bsArtikel
End Sub
'Nach dem Load ist das DataGridView1 komplett befüllt, da der Filter auf
' "AR_Nummer is null" gesetzt ist. Soweit also noch richtig.
Private Sub DataGridView1_MouseDoubleClick(ByVal sender As Object, ByVal e _
As System.Windows.Forms.MouseEventArgs) Handles _
DataGridView1.MouseDoubleClick
Dim info As DataGridView.HitTestInfo
Dim bs As BindingSource
Dim drvRow As DataRowView
If e.Button = Windows.Forms.MouseButtons.Left Then
If TabControl1.SelectedTab Is Nothing Then
MessageBox.Show("Bitte legen zu zunächst einen Tab an!", "Tab" & _
"anlegen", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
info = DataGridView1.HitTest(e.X, e.Y)
If info.RowIndex >= 0 Then
bs = CType(DataGridView1.DataSource, BindingSource)
DataGridView1.CurrentCell = DataGridView1.Rows( _
info.RowIndex).Cells(0)
drvRow = CType(bs.Current, DataRowView)
drvRow.Item("AR_Gruppe") = TabControl1.SelectedTab.Text
bs.EndEdit()
End If
End If
'Nach bs.EndEdit ist die Zeile aus dem DataGridView verschwunden, taucht aber
' im anderen Grid nicht auf! Zur Kontrolle habe ich die DataTable dann mal
' durchgeschliffen:
For Each dtrow As DataRow In dtData.Rows
If Not dtrow.Item("AR_Gruppe") Is DBNull.Value Then
MsgBox(dtrow.Item("AR_Gruppe"))
End If
Next
'Es erscheint nie eine MessageBox, einer der Werte muss doch nun aber geändert
' worden sein?
End Sub Sieht hier jemand, wo der Fehler liegen könnte? Der Filter der anderen BindingSources ist richtig, dies habe ich bereits kontrolliert. |