Hallo an alle!
Ich habe ein großes Problem unter VB2010 mit dem DataGridView und dem BindingSource.
Zu meinem Problem: Der User soll mehrere Tabellen bearbeiten können (hinzufügen, ändern, löschen). Welche Tabelle er bearbeiten will, sucht er sich aus einer Combobox heraus. Je nach Auswahl lade ich meine BindingSource mit einer anderen Tabelle (mit Hilfe von Linq). Das Hinzufügen und Ändern von Zeilen klappt auch hervorragend. Nur beim Löschen von Zeilen aus der Tabelle habe ich ein Problem. Da meine DB mit referenzieller Integrität erstellt wurde, darf ich ja nur Zeilen löschen, die nicht mit anderen Tabellen verbunden sind. Wenn ich eine Zeile neu anlege und sie danach wieder lösche, ist das kein Problem.
Wenn ich aber eine Zeile löschen will, die mit einer anderen Tabelle verbunden ist, dann bekomme ich ein merkwürdiges Phänomen. Erst bekomme ich eine Meldung, daß ich die Zeile nicht löschen kann (das ist ok so und auch so gewollt), aber dann ist diese Zeile trotzdem aus dem DatagridView verschwunden. In der DB ist sie noch zu finden. Ich muß erst auf eine andere Tabelle wechseln und dann wieder zurück, damit die Tabelle korrekt angezeigt wird.
Alles was ich versucht habe funktioniert nicht. Ich lade die Tabelle neu, ich lösche die BindingSource und erstelle sie neu. Immer wieder fehlt bei der Anzeige diese Zeile. Ich habe mit schon Messageboxen ausgeben lassen, wo ich die Anzahl der Datensätze der Tabelle mir anzeigen lasse. Er zeigt mir die korrekte Zahl 20 an, aber dann in der Datagrid sind es nur 19.
Was habe ich falsch gemacht? Ich hoffe ihr könnt mir helfen.
Hier ein Auszug des Quellcodes:
Combobox füllen:
----------------------
Dim Auswahl = From a In IVDB.tab_Verwaltung Select a.ID, a.Comboboxname, a.Tabellenname
cboListe.DataSource = Auswahl
cboListe.DisplayMember = "Comboboxname"
cboListe.ValueMember = "Tabellenname"
Mein Datagrid füllen:
--------------------------
Private Sub DatagridFuellen(ByVal strWomit As String)
Dim objDaten As New List(Of String)
Msg("Anfang Füllen: " & BindingSourceDaten.Count.ToString)
objDaten.Add("Lade Daten...")
BindingSourceDaten.DataSource = objDaten
BindingSourceDaten.Clear()
Msg("BindingSource löschen: " & BindingSourceDaten.Count.ToString)
Select Case strWomit
Case "tabTarifverträgeBindingSource"
'BindingSourceDaten.DataSource = IVDB.tab_Tarifverträge
Dim tv = From a In IVDB.tab_Tarifverträge Select a.ID, a.Bezeichnung, a.Bezeichnung2
BindingSourceDaten.DataSource = tv
Case "tabEntgeltbestandteileBindingSource"
IVDB.Refresh(Data.Linq.RefreshMode.OverwriteCurren tValues, IVDB.tab_Entgeltbestandteile)
Msg("Nach IVDB.Refresh: " & BindingSourceDaten.Count.ToString)
BindingSourceDaten.DataSource = IVDB.tab_Entgeltbestandteile.OrderBy(Function(a) a.Sortierung)
Msg("Nach BindingSource neu setzen: " & BindingSourceDaten.Count.ToString)
'Dim eb = From a In IVDB.tab_Entgeltbestandteile Order By a.Sortierung Select a.ID, a.Entgeltbezeichnung, a.Langbezeichnung, a.Grundlage, a.Priorität, a.Gültig_bis, a.Sortierung
'BindingSourceDaten.DataSource = eb
Case "tabEntgeltgruppenBindingSource"
BindingSourceDaten.DataSource = IVDB.tab_Entgeltgruppen
Case "tabKündigungsfristBedingungBindingSource"
BindingSourceDaten.DataSource = IVDB.tab_KündigungsfristBedingung
End Select
datListe.DataSource = BindingSourceDaten
BindingSourceDaten.ResetBindings(True)
datListe.Refresh()
datListe.Columns.Item("ID").Visible = False
Msg("Nach Füllen: " & BindingSourceDaten.Count.ToString)
End Sub
Löschen einer Zeile:
-------------------------
IVDB.tab_Entgeltbestandteile.DeleteOnSubmit(Bindin gSourceDaten.Current)
Try
IVDB.SubmitChanges()
Catch ex As Exception
Msg("Löschen nicht möglich, da der Eintrag verwendet wird!", MessageBoxIcon.Error)
End Try
DatagridFuellen(strDS)
Ich habe ein großes Problem unter VB2010 mit dem DataGridView und dem BindingSource.
Zu meinem Problem: Der User soll mehrere Tabellen bearbeiten können (hinzufügen, ändern, löschen). Welche Tabelle er bearbeiten will, sucht er sich aus einer Combobox heraus. Je nach Auswahl lade ich meine BindingSource mit einer anderen Tabelle (mit Hilfe von Linq). Das Hinzufügen und Ändern von Zeilen klappt auch hervorragend. Nur beim Löschen von Zeilen aus der Tabelle habe ich ein Problem. Da meine DB mit referenzieller Integrität erstellt wurde, darf ich ja nur Zeilen löschen, die nicht mit anderen Tabellen verbunden sind. Wenn ich eine Zeile neu anlege und sie danach wieder lösche, ist das kein Problem.
Wenn ich aber eine Zeile löschen will, die mit einer anderen Tabelle verbunden ist, dann bekomme ich ein merkwürdiges Phänomen. Erst bekomme ich eine Meldung, daß ich die Zeile nicht löschen kann (das ist ok so und auch so gewollt), aber dann ist diese Zeile trotzdem aus dem DatagridView verschwunden. In der DB ist sie noch zu finden. Ich muß erst auf eine andere Tabelle wechseln und dann wieder zurück, damit die Tabelle korrekt angezeigt wird.
Alles was ich versucht habe funktioniert nicht. Ich lade die Tabelle neu, ich lösche die BindingSource und erstelle sie neu. Immer wieder fehlt bei der Anzeige diese Zeile. Ich habe mit schon Messageboxen ausgeben lassen, wo ich die Anzahl der Datensätze der Tabelle mir anzeigen lasse. Er zeigt mir die korrekte Zahl 20 an, aber dann in der Datagrid sind es nur 19.
Was habe ich falsch gemacht? Ich hoffe ihr könnt mir helfen.
Hier ein Auszug des Quellcodes:
Combobox füllen:
----------------------
Dim Auswahl = From a In IVDB.tab_Verwaltung Select a.ID, a.Comboboxname, a.Tabellenname
cboListe.DataSource = Auswahl
cboListe.DisplayMember = "Comboboxname"
cboListe.ValueMember = "Tabellenname"
Mein Datagrid füllen:
--------------------------
Private Sub DatagridFuellen(ByVal strWomit As String)
Dim objDaten As New List(Of String)
Msg("Anfang Füllen: " & BindingSourceDaten.Count.ToString)
objDaten.Add("Lade Daten...")
BindingSourceDaten.DataSource = objDaten
BindingSourceDaten.Clear()
Msg("BindingSource löschen: " & BindingSourceDaten.Count.ToString)
Select Case strWomit
Case "tabTarifverträgeBindingSource"
'BindingSourceDaten.DataSource = IVDB.tab_Tarifverträge
Dim tv = From a In IVDB.tab_Tarifverträge Select a.ID, a.Bezeichnung, a.Bezeichnung2
BindingSourceDaten.DataSource = tv
Case "tabEntgeltbestandteileBindingSource"
IVDB.Refresh(Data.Linq.RefreshMode.OverwriteCurren tValues, IVDB.tab_Entgeltbestandteile)
Msg("Nach IVDB.Refresh: " & BindingSourceDaten.Count.ToString)
BindingSourceDaten.DataSource = IVDB.tab_Entgeltbestandteile.OrderBy(Function(a) a.Sortierung)
Msg("Nach BindingSource neu setzen: " & BindingSourceDaten.Count.ToString)
'Dim eb = From a In IVDB.tab_Entgeltbestandteile Order By a.Sortierung Select a.ID, a.Entgeltbezeichnung, a.Langbezeichnung, a.Grundlage, a.Priorität, a.Gültig_bis, a.Sortierung
'BindingSourceDaten.DataSource = eb
Case "tabEntgeltgruppenBindingSource"
BindingSourceDaten.DataSource = IVDB.tab_Entgeltgruppen
Case "tabKündigungsfristBedingungBindingSource"
BindingSourceDaten.DataSource = IVDB.tab_KündigungsfristBedingung
End Select
datListe.DataSource = BindingSourceDaten
BindingSourceDaten.ResetBindings(True)
datListe.Refresh()
datListe.Columns.Item("ID").Visible = False
Msg("Nach Füllen: " & BindingSourceDaten.Count.ToString)
End Sub
Löschen einer Zeile:
-------------------------
IVDB.tab_Entgeltbestandteile.DeleteOnSubmit(Bindin gSourceDaten.Current)
Try
IVDB.SubmitChanges()
Catch ex As Exception
Msg("Löschen nicht möglich, da der Eintrag verwendet wird!", MessageBoxIcon.Error)
End Try
DatagridFuellen(strDS)
Comment