DataGridView 始终使用 AutoSizeColumnsMode=Fill 显示 VerticalScrollBar

Jam*_*mes 5 c# datagridview winforms

我有一个包含 3 个垂直堆叠的 DataGridView 控件的表单。所有那里的网格都具有相同列宽的相同列。所有 3 个网格都有 AutoSizeColumnsMode=Fill 使列填充网格的整个宽度。因此,所有列在所有网格上都相互对齐。

当某些网格的行数超过适合的行数而其他网格的行数不适合时,就会出现我的问题。这会导致某些网格具有垂直滚动条。当滚动条显示时,它会导致列允许的空间缩小滚动条的宽度。因为我使用 AutoSizeColumnsMode=Fill 它导致列不再在网格之间排列。

这是我得到的。正如你所看到的,第一个网格有更多的 3 行适合,所以有一个滚动条。第二个和第三个网格只有 3 行,因此没有滚动条。第二个和第三个网格中的列对齐,但它们不与第一个网格对齐。

在此处输入图片说明

为了解决这个问题,我想强制垂直滚动条始终显示,即使没有滚动。

我在网上做了一些搜索,找到了一个几乎有效的解决方案。

public class CustomDataGridView : DataGridView
{
    private const int BORDERWIDTH = 2;

    public CustomDataGridView()
    {
        VerticalScrollBar.Visible = true;
        VerticalScrollBar.VisibleChanged += VerticalScrollBarOnVisibleChanged;
        ClientSize = new Size(ClientSize.Width - 21, ClientSize.Height);
    }

    private void VerticalScrollBarOnVisibleChanged(object sender, EventArgs eventArgs)
    {
        if (!VerticalScrollBar.Visible)
        {
            int width = VerticalScrollBar.Width;

            VerticalScrollBar.Location =
                new Point(ClientRectangle.Width - width - BORDERWIDTH, 1);

            VerticalScrollBar.Size =
                new Size(width, ClientRectangle.Height - BORDERWIDTH);


            ClientSize = new Size(ClientSize.Width, ClientSize.Height);

            VerticalScrollBar.Show();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是滚动条显示在最后一列的顶部并覆盖最后一列标题的末尾,而不是强制所有列的总宽度减少滚动条的宽度。我希望滚动条强制列窄一点,就像您在第一个网格中看到的那样。