DataGridView Probleme, nonvisible Zeilen sind immer noch sichtbar und das DataGridView leer ist obwohl er eine DataSource
Ich habe mehrere Probleme mit Zeilen in einer DataGridView
.
Hintergrund-Informationen: Die DataGridView
(DataGridViewCalib
) ist in einem TabPage
einer TabControl
einige Spalten des DataGridView automatisch DataGridViewCheckBoxColumn
als DataSource
haben einige Spalten, die Boolean
. Dies ist eine Windows-Form geschrieben VB.Net mit Visual Studio 2008. Der Benutzer lädt ein Eingabe-Daten-Datei.
Die Probleme:
1) Bei der ersten Ankunft in der TabPage
, ShowDataGridViewCalib
(code unten) aufgerufen wird. Alle Zeilen werden dann angezeigt in der DataGridView
trotz dem code sagen, dass einige Zeilen nicht sichtbar sein soll. Haltepunkte in den code zeigen, dass der code ankommen, an der Rows.Visible = False
Veranstaltungen.
Trotz aller Zeilen beeing gezeigt, dass eine Uhr in der debugger zeigt, dass:
DataGridViewCalib.DisplayedColumnCount(True)=0
DataGridViewCalib.DisplayedColumnCount(False=0)
DataGridViewCalib.DisplayedRowCount(True)=0
DataGridViewCalib.DisplayedRowCount(False)=0
Columns.Visible=False
funktioniert wie erwartet.
Beim ausführen der Unterroutine ShowDataGridViewCalib
ein zweites mal, durch die Durchsetzung von checkbox
CbUniform
, die Reduzierung der Anzahl der Zeilen funktioniert wie es sollte, und die DataGridViewCalib.Displayed...Count
korrekt ist.
Was bewirkt, dass die ganze DataTable
gezeigt werden das erste mal?
2) der Benutzer kann Die Last einer anderen Eingabe-Daten-Datei. Wenn eine zweite Eingabe-Datei geladen und ShowDataGridViewCalib
ausgeführt wird, eine andere seltsame Sache auftreten. DataGridViewCalib.DataSource = {System.Data.DataTable}
und diese DataTable
hat die gleichen Eigenschaften wie dtCatchCalib
,
aber
DataGridViewCalib.Columns.Count = 0
DataGridViewCalib.Rows.Count = 0
ist und nichts angezeigt wird in der DataGridView
.
Vor dem zweiten Eingabe-Datei geladen wird, werden die meisten Daten gelöscht, einschließlich DataGridViewCalib.Columns.Clear()
und dtCatchCalib.Clear()
. Vor allem für das zweite problem ich gehe davon aus, dass der Fehler könnte irgendwo außerhalb der ShowDataGridViewCalib
, aber ich wäre sehr froh für Hinweise darauf, was bewirkt, dass die DataGridView
eine DataSource
aber noch keine Zeilen und Spalten.
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
Gibt es zwei alternative Wege im Umgang mit den Zeilen in den code. Der erste Versuch (kommentierte entfernt hier) ist wohl der "netteste".
Dies ist das erste mal, dass ich post mit einer Frage an ein Programmier forum. Bitte Fragen Sie mich wieder, wenn ich nicht Ausdrücken wollte mich eindeutig genug.
- Ich habe gerade gebucht die gleichen Fragen hier social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/..., Wenn ich eine Antwort bekommen in einem forum habe ich links zu, die am anderen fourm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe noch immer keine Ahnung, warum das Programm verhielt sich so, als beschrieben, aber ich habe jetzt einen workaround. Die
DataTable
ich bin die Anzeige ist ohnehin eine temporäreDataTable
, die Kombination von Spalten aus zwei verschiedenenDataTables
, ich würde wirklich gerne zeigen. Damit ich entfernt die Zeilen, die bereits von dieser temporärenDataTable
, zu tun, anstatt es durch dieDataGridView
. Durch dieCellValueChanged
Veranstaltung ich bin an der Weitergabe der änderungen in die temporäreDataTable
auf die ursprünglicheDataTables
.Das zweite problem habe ich gelöst, indem auch die Einstellung
wenn ich räumte die Formulare und die Daten vor dem laden einer neuen Datei.
Habe ich auch eine ausführliche Antwort hier http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574
vom Aland Li, sagen
Dem NiL
BindingSource
wenn Sie nicht WIEDER: stackoverflow.com/a/14501458/427684