2009-07-30 11 views
2

Ich habe mehrere Probleme mit Zeilen in einem DataGridView.DataGridView-Probleme, nicht sichtbare Zeilen sind immer noch sichtbar und die DataGridView ist leer trotz einer DataSource

Hintergrundinformationen: DieDataGridView (DataGridViewCalib) ist in einem TabPage eines TabControl einige Spalten der Datagridview automatisch DataGridViewCheckBoxColumn als DataSource haben einige colums die Boolean sind. Dies ist ein Windows-Formular, das in VB.Net mit Visual Studio 2008 geschrieben wird. Der Benutzer lädt eine Eingabedatendatei.

Die Probleme:

1) Bei der ersten Ankunft in der TabPage, ShowDataGridViewCalib (Code unten) aufgerufen wird. Alle Zeilen werden dann in der DataGridView angezeigt, obwohl der Code besagt, dass einige Zeilen nicht sichtbar sein sollten. Breakpoints im Code zeigen, dass der Code die Rows.Visible = False-Ereignisse erreicht. Trotz aller Reihen beeing eine Uhr in der Debugger zeigt, daß:

DataGridViewCalib.DisplayedColumnCount(True)=0 
DataGridViewCalib.DisplayedColumnCount(False=0) 
DataGridViewCalib.DisplayedRowCount(True)=0 
DataGridViewCalib.DisplayedRowCount(False)=0 

Columns.Visible=False funktioniert wie erwartet.

Wenn das Unterprogramm ShowDataGridViewCalib ein zweites Mal ausgeführt wird, indem es aus dem checkboxCbUniform, die Verringerung der Anzahl der Zeilen funktioniert, wie es sollte, und die DataGridViewCalib.Displayed...Count ist die Durchsetzung richtig.

Was bewirkt, dass das ganze DataTable das erste Mal angezeigt wird?

2) Der Benutzer kann eine andere Eingabedatei laden. Wenn eine zweite Eingabedatei geladen wird und ShowDataGridViewCalib ausgeführt wird, tritt eine andere seltsame Sache auf. DataGridViewCalib.DataSource = {System.Data.DataTable} und diese DataTable hat die gleichen Eigenschaften wie dtCatchCalib, aber

DataGridViewCalib.Columns.Count = 0 
DataGridViewCalib.Rows.Count = 0 

und nichts ist in der DataGridView gezeigt. Bevor die zweite Eingabedatei geladen wird, werden die meisten Daten gelöscht, einschließlich DataGridViewCalib.Columns.Clear() und dtCatchCalib.Clear(). Vor allem für dieses zweite Problem gehe ich davon aus, dass der Fehler irgendwo außerhalb von ShowDataGridViewCalib liegen könnte, aber ich wäre sehr glücklich für Hinweise darüber, was die DataGridView zu einer DataSource aber immer noch keine Zeilen und Spalten hat.

Der Code:

Private Sub ShowDataGridViewCalib() 
    '[...] 
       Dim kolwidth As Integer = 77 
       DataGridViewCalib.DataSource = dtCatchCalib 
       DataGridViewCalib.Refresh() 
       Dim kol As DataGridViewColumn 
       For Each kol In DataGridViewCalib.Columns 
        kol.SortMode = DataGridViewColumnSortMode.NotSortable 
        If CbUniform.Checked = False Then 
         kol.Visible = True 
         kol.Width = kolwidth 
         If kol.Name = "CatchmentID" Then 
          kol.ReadOnly = True 
         ElseIf kol.Name = "parc0" Then 
          kol.HeaderText = "c0" 
         ElseIf kol.Name = "statr" Then 
          kol.Visible = False 
          kol.ReadOnly = True 
          kol.HeaderText = "r" 
         End If 
        Else 
         If kol.Name = "IncludeObs" Then 
          kol.Width = kolwidth 
         ElseIf kol.Name = "CatchmentID" Then 
          kol.ReadOnly = True 
          kol.Width = kolwidth 
         Else 
          kol.Visible = False 
         End If 
        End If 
       Next 

       'Dim rad As DataGridViewRow 
       'Dim dum As Integer 
       'dum = 0 
       'For Each rad In DataGridViewCalib.Rows 
       ' dum += 1          ' # rows in dtCatchCalib is = # subcatchments 
       ' DataGridViewCalib.CurrentCell = Nothing   ' Unselect the current cell, needed to be able to set the row invisible 
       ' rad.Visible = False        ' TEST 
       ' If ObsLst(dum) = True Then      ' ObsLst have its first value at index 1 
       '  rad.Visible = True 
       ' Else 
       '  DataGridViewCalib.CurrentCell = Nothing  ' Unselect the current cell, needed to be able to set the row invisible 
       '  rad.Visible = False 
       ' End If 
       'Next 

       For i = 0 To dtCatchCalib.Rows.Count - 1 
        DataGridViewCalib.CurrentCell = Nothing 
        DataGridViewCalib.Rows(i).Visible = False 
        If ObsLst(i+1) = True Then      ' ObsLst have its first value at index 1 
         DataGridViewCalib.Rows(i).Visible = True 
        Else 
         DataGridViewCalib.CurrentCell = Nothing 
         DataGridViewCalib.Rows(i).Visible = False 
        End If 

       Next 


'[...] 
    End Sub 

Es gibt zwei alternative Möglichkeiten, um die Zeilen in dem Code verarbeitet. Der erste Versuch (hier kommentiert) ist wohl der "Schönste".

Dies ist das erste Mal, dass ich eine Frage in einem Programmierforum posten. Bitte frag mich nochmal, ob ich mich nicht klar genug ausgedrückt habe.

+0

Ich habe gerade gebucht die gleichen Fragen hier http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574 Wenn ich eine Antwort in einem Forum bekomme, werde ich Links zu diesem auf den anderen vier geben. –

Antwort

0

Ich habe immer noch keine Ahnung, warum das Programm wie beschrieben verhielt, aber ich habe jetzt einen Workaround. Die DataTable, die ich zeige, ist jedenfalls eine temporäre DataTable, die Spalten von zwei verschiedenen DataTables kombiniert, die ich eigentlich gerne zeigen würde. So habe ich die Zeilen bereits aus diesem temporären DataTable entfernt, anstatt es über die DataGridView zu tun.Durch das CellValueChanged Event gebe ich die Änderungen im temporären DataTable an das Original DataTables weiter.

0

Das zweite Problem, das ich von auch

DataGridViewCalib.DataSource=Nothing 

, wenn ich die Formulare gelöscht und die Daten, bevor Sie eine neue Datei gelöst Einstellung zu laden.

Ich habe auch eine additonal Antwort hier http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574

von Aland Li,

sagen

Basierend auf Ihrer Beschreibung, die beiden Probleme haben ein gemeinsames Merkmal: Wir haben die Eigenschaft Visible festgelegt haben, aber es hat nicht reagieren. Die Ursache ist meist, dass die Datenquelle erneut gebunden wird, nachdem wir die Visible-Eigenschaft der Zeilen in der DataGridView festgelegt haben. Zum Beispiel legen wir alle Zeilen unsichtbar fest, indem wir die Visible-Eigenschaft von ihnen auf false setzen und erwarten, dass sie ausgeblendet sind. Die Datenquelle wird jedoch möglicherweise erneut gebunden, nachdem wir die Visible-Eigenschaft festgelegt und die Zeilen neu erstellt haben. Die alten Reihen sind so angeordnet, dass die Einstellung nicht reagieren würde. Die neuen Zeilen werden initialisiert und ihre Visible-Eigenschaft ist wahr. Die Zeilen sind also immer noch sichtbar. Sie können die Datenquellenbindung verfolgen, indem Sie das DataBindingComplete-Ereignis verfolgen. Sie können diesem Ereignis einen Handler hinzufügen und eine Nachricht anzeigen. Dann würden Sie wissen, ob die Datenquelle erneut gebunden ist.

Der Nil

+0

Möglicherweise lohnt es sich, eine "BindingSource" zu verwenden, wenn Sie nicht RE sind: http://StackOverflow.com/a/14501458/427684 – Coops

Verwandte Themen