У меня есть несколько проблем со строками в DataGridView
.
Справочная информация: DataGridView
(DataGridViewCalib
) находится в одном TabPage
из TabControl
, некоторые столбцы DataGridView автоматически DataGridViewCheckBoxColumn
, поскольку DataSource
имеют некоторые столбцы, которые Boolean
. Это форма Windows, написанная на VB.Net для Visual Studio 2008. Пользователь загружает файл входных данных.
Проблемы:
1) При первом прибытии в TabPage
, ShowDataGridViewCalib
(код ниже) вызывается. Все строки затем отображаются в DataGridView
, несмотря на то, что код говорит, что некоторые строки не должны быть видны. Точки останова в коде показывают, что код действительно достигает событий Rows.Visible = False
.
Несмотря на то, что все строки показаны, часы в отладчике показывают, что:
DataGridViewCalib.DisplayedColumnCount(True)=0
DataGridViewCalib.DisplayedColumnCount(False=0)
DataGridViewCalib.DisplayedRowCount(True)=0
DataGridViewCalib.DisplayedRowCount(False)=0
Columns.Visible=False
работает как положено.
При запуске подпрограммы ShowDataGridViewCalib
во второй раз, принудительно применяя ее из checkbox
CbUniform
, уменьшение количества строк работает как следует, и DataGridViewCalib.Displayed...Count
является правильным.
Что вызывает показ всего целого DataTable
в первый раз?
2) Пользователь может загрузить другой файл входных данных. Когда загружается второй входной файл и запускается ShowDataGridViewCalib
, происходит еще одна странная вещь. DataGridViewCalib.DataSource = {System.Data.DataTable}
и этот DataTable
имеет те же свойства, что и dtCatchCalib
,
но
DataGridViewCalib.Columns.Count = 0
DataGridViewCalib.Rows.Count = 0
и ничего не отображается в DataGridView
.
Перед загрузкой второго входного файла большая часть данных очищается, включая DataGridViewCalib.Columns.Clear()
и dtCatchCalib.Clear()
. Специально для этой второй проблемы я предполагаю, что ошибка может быть где-то за пределами ShowDataGridViewCalib
, но я был бы очень рад намекам о том, что в DataGridView
есть DataSource
, но все еще нет строк и столбцов.
Код:
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
Существует два альтернативных способа обработки строк в коде. Первая попытка (прокомментированная здесь), вероятно, самая «хорошая».
Это первый раз, когда я задаю вопрос форуму по программированию. Пожалуйста, спросите меня снова, не выразил ли я себя достаточно ясно.