Announcement

Collapse
No announcement yet.

Probleme mit DataGridView und BindingSource

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit DataGridView und BindingSource

    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)

  • #2
    Hi,

    ich arbeite zwar mit vb2008 und anders als du, aber das Phänomen mit DatagridView und komischen Anzeigen kenne ich.

    Ich tippe mal, dass dein Dataset nicht synchron zur Datenbank ist. Es gibt da einen zwischenstate für die Zeilen. Ich weiß nicht mehr ausm Kopf, wie der heißt, aber er bedeutet quasi "Angelöscht".. also gelöscht, aber noch im Set.


    Bei mir funktioniert es vom Prinzip her so:

    Änderung an Dataset beispielhaft (adden, ändern, löschen):

    [highlight=vbnet]
    ---
    Dim cmdBuilder As SqlCommandBuilder
    Dim changes As DataSet
    Dim dsNewRow As DataRow
    Dim cn As New SqlConnection(mydbcnstring)
    Dim ds As New DataSet()
    Dim da As SqlDataAdapter

    da = New SqlDataAdapter("select top 1 * from tbl_artikel", cn)
    da.Fill(dsextended, "customers")

    dsNewRow = ds.Tables("customers").NewRow()
    dsNewRow.Item("product_id") = CInt(mysearchid)
    dsNewRow.Item("kunden_gruppen_id") = CInt(mykdgruppe)
    ds.Tables("customers").Rows.Add(dsNewRow)

    ---
    cmdBuilder = New SqlCommandBuilder(da)
    changes = ds.GetChanges()

    If changes IsNot Nothing Then
    da.Update(changes, "customers")
    ds.Clear()
    da.Fill(ds, "customers")
    End If
    ---
    [/highlight]

    Ich hoffe du kannst damit was tun
    --------------------------------------------------------
    Signatur im Brandfall nicht benutzen !

    Comment

    Working...
    X