2

我在 a 中的行有几个问题DataGridView

背景信息: ( DataGridView)DataGridViewCalib在其中之一TabPageTabControl,DataGridView 的某些列自动DataGridViewCheckBoxColumn作为DataSource具有某些列的列Boolean。这是使用 Visual Studio 2008 用 VB.Net 编写的 Windows 窗体。用户加载输入数据文件。

问题:

1)在第一次到达时TabPageShowDataGridViewCalib(下面的代码)被调用。然后所有行都显示在 中DataGridView,尽管代码说某些行不应该是可见的。代码中的断点表明代码确实到达了Rows.Visible = False事件。尽管在调试器中显示了所有行,但 Watch 显示:

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,但是我很乐意提供有关导致DataGridViewDataSource但仍然没有行和列的原因的提示。

编码:

    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

有两种方法可以处理代码中的行。第一次尝试(在此处注释掉)可能是“最好的”。

这是我第一次在编程论坛上发布问题。请再问我是否表达得不够清楚。

4

2 回答 2

0

我通过设置解决的第二个问题

DataGridViewCalib.DataSource=Nothing

当我在加载新文件之前清除表格和数据时。

我在这里也得到了额外的回复http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574

来自 Aland Li 说

根据您的描述,这两个问题有一个共同特点:我们确实设置了 Visible 属性,但它没有反应。原因主要是我们在DataGridView中设置了行的Visible属性后再次绑定了数据源。例如,我们通过将所有行的 Visible 属性设置为 false 来设置所有行不可见,并期望它们被隐藏。但是在我们设置 Visible 属性并重新创建行之后,可能会再次绑定数据源。旧行已处理,因此设置不会做出反应。新行被初始化并且它们的 Visible 属性为真。所以这些行仍然可见。您可以通过跟踪 DataBindingComplete 事件来跟踪数据源绑定。您可以向该事件添加处理程序并显示一些消息。然后你会知道数据源是否再次绑定。

尼罗河

于 2009-08-05T11:38:37.120 回答
0

我仍然不知道为什么程序会像描述的那样运行,但我现在有一个解决方法。无论如何,DataTable我正在显示的是一个临时的,组合了我实际上想要显示DataTable的两个不同的列。DataTables因此,我已经从这个临时文件中删除了行DataTable,而不是通过 DataGridView. 通过CellValueChanged事件,我将临时的更改传递DataTable给原始的 DataTables.

于 2009-08-05T06:35:00.070 回答