Проблемы с DataGridView, невидимые строки все еще видны, а DataGridView пуст, несмотря на наличие DataSource - PullRequest
2 голосов
/ 30 июля 2009

У меня есть несколько проблем со строками в 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

Существует два альтернативных способа обработки строк в коде. Первая попытка (прокомментированная здесь), вероятно, самая «хорошая».

Это первый раз, когда я задаю вопрос форуму по программированию. Пожалуйста, спросите меня снова, не выразил ли я себя достаточно ясно.

Ответы [ 2 ]

0 голосов
/ 05 августа 2009

Вторая проблема, которую я решил, также установив

DataGridViewCalib.DataSource=Nothing

когда я очистил формы и данные перед загрузкой нового файла.

Я также получил дополнительный ответ здесь http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574

от Аланд Ли, сказав

Исходя из вашего описания, две проблемы имеют общую особенность: мы установили свойство Visible, но оно не отреагировало. Причина в основном в том, что источник данных снова связывается после того, как мы установили свойство Visible строк в DataGridView. Например, мы устанавливаем все строки невидимыми, устанавливая для свойства Visible их значение false и ожидаем, что они скрыты. Но источник данных может быть снова привязан после того, как мы установим свойство Visible и строки будут воссозданы. Старые строки расположены таким образом, чтобы настройка не реагировала. Новые строки инициализируются, и их свойство Visible имеет значение true. Таким образом, строки все еще видны. Вы можете отслеживать привязку источника данных, отслеживая событие DataBindingComplete. Вы можете добавить обработчик к этому событию и показать некоторое сообщение. Тогда вы узнаете, связан ли источник данных снова.

Нил

0 голосов
/ 05 августа 2009

Я до сих пор не понимаю, почему программа вела себя так, как описано, но теперь у меня есть обходной путь. DataTable, который я показываю, в любом случае является временным DataTable, объединяющим столбцы из двух разных DataTables, которые я бы хотел показать. Таким образом, я удалил строки уже из этого временного DataTable вместо того, чтобы делать это через DataGridView. Через событие CellValueChanged я передаю изменения временного DataTable к исходному DataTables.

...