Announcement

Collapse
No announcement yet.

Datagridview - Spalten beim Aufrufen verschoben?

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

  • Datagridview - Spalten beim Aufrufen verschoben?

    Hallo zusammen,

    vor ca. 5 Jahren habe ich mit VB.Net angefangen und auch ein Fernstudium erfolgreich abgeschlossen. Dennoch habe ich bis heute mit Access VBA gearbeitet. Nun bin ich aber auf VB.Net umgeschwenkt und erstelle aktuell mein erstes kleines Projekt "FlatTicker".

    Zur Verfügung steht mir auf Arbeit VB.Net 2005 Prof. Englisch.

    Ich habe aktuell eine Access DBdatei mit u.a. zwei Tabellen:
    tbl_gruppe & tbl_platz

    Die datenbankdatei binde ich im VB Code ein
    Code:
    Module AccessDB
        Public con As New OleDb.OleDbConnection
        Public cmd As New OleDb.OleDbCommand
        Public reader As OleDb.OleDbDataReader
        Public anzahl As Integer
    
        Public ds As New DataSet
        Public dt As New DataTable
        Public da As OleDb.OleDbDataAdapter
        Public bs As New BindingSource
    
        Public Sub Provider()
            con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=f:\test.mdb;"
            cmd.Connection = con
        End Sub
    
    
    End Module
    Desweiteren habe ich unter anderem zwei Forms.
    Auf diesen beiden Formen sind jeweils ein ungebundenes Datagridview welches wiefolgt gefüllt wird.

    Code:
    Private Sub DGV_Gruppe_List(ByVal DGV As DataGridView)
            dt.Clear()
            Provider()
            ds.Tables.Add(New DataTable)
            da = New OleDb.OleDbDataAdapter("select gruppen_id, gruppe from tbl_gruppe", con) 'Hier ist das wesentliche. Mit dem * sagen wir dem Programm, das wir alle Spalten der Tabelle laden möchte. Tabelle muss man eben durch den richtigen Tabellennamen ersetzen.
            da.Fill(dt)
            Dim cb As New OleDb.OleDbCommandBuilder(da)
            bs.DataSource = dt
            DGV.DataBindings.Clear()
    
            DGV.DataSource = Nothing
            DGV.DataSource = bs
    
            'Spaltenbreite
            DGV.Columns(0).Width = 0
            DGV.Columns(1).Width = 200
            DGV.Columns("gruppen_id").Visible = False 'erste Spalte ausblenden
        End Sub
    Code:
    'Formular laden
        Private Sub Gruppe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DGV_Gruppe_List(dgv_GruppeForm) 'DataGridView laden
            dgv_GruppeForm.ClearSelection() 'DataGridView deselektieren
            Me.txtGruppe.Text = "" : Me.txtID.Text = ""
        End Sub
    Das gleiche dann natürlich auch für die Tabelle Platz.

    Code:
    Private Sub DGV_Platz_List(ByVal DGV As DataGridView)
            dt.Clear()
            Provider()
            'ds.Tables.Add(New DataTable)
            da = New OleDb.OleDbDataAdapter("select platz_id, pcname, pczusatz from tbl_platz", con) 'Hier ist das wesentliche. Mit dem * sagen wir dem Programm, das wir alle Spalten der Tabelle laden möchte. Tabelle muss man eben durch den richtigen Tabellennamen ersetzen.
            da.Fill(dt)
            Dim cb As New OleDb.OleDbCommandBuilder(da)
            bs.DataSource = dt
            DGV.DataBindings.Clear()
            DGV.DataSource = Nothing
            DGV.DataSource = bs
    
            'Spaltenbreite
            DGV.Columns(0).Width = 0
            DGV.Columns(1).Width = 75
            DGV.Columns(2).Width = 150
            DGV.Columns("platz_id").Visible = False 'erste Spalte ausblenden
        End Sub
    Code:
    Private Sub Platz_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DGV_Platz_List(dgv_PlatzForm) 'DataGridView laden
            dgv_PlatzForm.ClearSelection() 'DataGridView deselektieren
            Me.txtPlatz.Text = System.Environment.MachineName
            Me.txtZusatz.Text = "" : Me.txtID.Text = ""
        End Sub
    Wenn ich nun zur Laufzeit als erstes die Form Platz aufrufe, zeigt er mir alles normal an.
    Wenn ich dann die Form schließe und die Form Gruppe öffne, sind die Spalten um eins nach rechts verschoben, die erste Spalte ist leer.
    Wenn ich das wiederum schließe und den Platz öffne, ist alles wieder o.k., bei der Platz Form.

    Schließe ich komplett alles und starte wieder neu, mach diese anderes herum, ist genau das zweite wieder verschoben.

    D.h. die erste Form zeigt er immer richtig an, sobald ich die zweite Form das Grid lade ist alles um eins verschoben.

    Hier im Forum habe ich aus 2006 mal ein Thread gesehen, bei dem das ähnliche Phänomen auftratt. Es hies man sollte .reset durchführen, dann funktioniert es. Sobald ich dies aber mache ist und bleibt die Form leer?

    Kann mir jemand helfen?

    Nachtrag: beim ersten öffnen sind die Daten noch da, wenn ich zur Laufzeit die gleiche Form schließe und neu öffne oder die Form schließe und die andere Form öffne keine Daten vorhanden bei dt.reset()

    Nachtrag2: es liegt definitiv an der variable dt !
    Aber wie gesagt mit reset, ist und bleibt alles leer, nach dem ersten aufruf. Clear reicht auch nicht?
    Hatte mal die Variable als dt1 deklariert, da funktioniert es dann, wenn man es so trennt ;-(
    Aber ich müsste doch auch eine Variable für beide Grids verwenden können?

    LG Marja
    Zuletzt editiert von marja78; 07.12.2012, 11:43.

  • #2
    Du füllst also beide Tabellen in dieselbe Variable? Hast du mal nach dem Füllen per Debugger geschaut welche Spalten dieser DataTable dann hat?
    Ich vermute mal, dass du das reset (bzw. dt=Nothing) vor dem da.Fill(dt) aufrufen solltest, damit die alten Spalten auf jeden Fall gelöscht werden.

    Außerdem sprichst du die Spalten mal mit Index an, mal mit dem Bezeichner - sehr unsauber und fehleranfällig.
    Warum stellst du bei Spalte 1 erst die Weite auf 0 und machst sie dann unsichtbar? Letzteres sollte ausreichen.

    Comment

    Working...
    X