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 checkbox
CbUniform
, 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.
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. –