为什么我的DataGridView会阻止显示底部数据以及如何修复它?

时间:2014-06-03 14:42:54

标签: .net vb.net winforms datagridview scrollbars

我有一个带有DataGridView的表单。我格式化如下:

dgvECN.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
dgvECN.Columns(0).Width = 50
...
dgvECN.Columns(15).Width = 100
dgvECN.DefaultCellStyle.WrapMode = DataGridViewTriState.True

网格总是拥有比一个屏幕上显示的数据更多的数据,所以我依赖滚动条 - 主要是垂直方向。如果我用鼠标抓住滚动条并将其向下拖动到最远的位置,它可能会停止在向下的97%左右,就好像我已到达底部并且有更多行数据我没有'还没滚到。我可以释放滚动条并再次抓住它并向下拖动它会进一步下降,但不会一直向下。在第四次尝试(使用当前数据),它到达底部。

我可以按住滚动条底部的向下箭头,这样可行。我可以将光标/箭头向下或向下翻页到底部。当我做任何这些事情时,滚动手柄会向下抖动,然后向上调整,就像它重新计算一样。

我尝试使用以下方式显示数据底部的表单:

dgvECN.FirstDisplayedScrollingRowIndex = dgvECN.RowCount - 1

但是,将视图滚动到数据区域周围,网格似乎最初认为底部是,而不是实际的底部。

认为这是我第一次使用在网格单元格中包装文本,所以我怀疑这是一个原因。

但是我一直在阅读和阅读,虽然我发现了大量异国情况的错误和错误,但最初听起来并不相关,但最终并不是我的问题,而且我找不到任何可以修复它的东西。

随意在评论中询问有关我的项目的具体信息,我不确定您可能需要帮助诊断这一点。谢谢你的时间!

ETA:.NET 4.0和VS Express 2013,万一重要。

ETA2:我试图设置有载显示,使其显示数据的底部而不是顶部。我这样做是为了:

dgvECN.CurrentCell = dgvECN.Item(0, dgvECN.Rows.Count - 1)

但实际上并没有把它带到数据的底部。我想这是同样错误的表现。

ETA3:这是当它加载当前单元格设置到底行时的样子: bugged DataGridView

ETA4:DataGridView Designer代码:

    '
    'dgvECN
    '
    Me.dgvECN.AllowUserToAddRows = False
    Me.dgvECN.AllowUserToDeleteRows = False
    Me.dgvECN.AllowUserToOrderColumns = True
    Me.dgvECN.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
        Or System.Windows.Forms.AnchorStyles.Left) _
        Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.dgvECN.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill
    Me.dgvECN.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
    Me.dgvECN.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
    Me.dgvECN.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Check})
    Me.dgvECN.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically
    Me.dgvECN.Location = New System.Drawing.Point(3, 3)
    Me.dgvECN.Name = "dgvECN"
    Me.dgvECN.Size = New System.Drawing.Size(1102, 670)
    Me.dgvECN.TabIndex = 5

1 个答案:

答案 0 :(得分:2)

这是针对此问题的测试程序(用C#编写,但应该适用于VB)。它假设您有一个名为dataGridView1的DataGridView

AutoSizeRowsMode属性应设置为DataGridViewAutoSizeRowsMode.AllCells,以避免您遇到的问题。

        DataTable data = new DataTable("Example");
        data.Columns.Add("1");
        data.Columns.Add("2");
        data.Columns.Add("3");
        data.Columns.Add("4");

        for (int i = 0; i < 2000; i++)
        {
            data.Rows.Add(new []
                {
                    "1",
                    "2",
                    "LONG STRING THAT SHOULD WRAP TO MULTIPLE LINES",
                    "4"
                });
        }
        data.Rows.Add(new[]
                {
                    "1",
                    "2",
                    "LONG STRING THAT SHOULD WRAP TO MULTIPLE LINES",
                    "Last Row!!!"
                });

        dataGridView1.AllowUserToAddRows = false;
        dataGridView1.AllowUserToDeleteRows = false;
        dataGridView1.AllowUserToOrderColumns = true;
        dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.Fill; 
        dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders; // Appears that this line should be `AllCells` to avoid the problem you are facing
        dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
        dataGridView1.DataSource = data;