DataGridView最后一列无法调整范围

时间:2017-05-20 06:51:47

标签: c# winforms datagridview

长话短说,我遇到了与DataGridView resizeable columns, but last column can't be resized bigger?相同的问题。只要所有列的总宽度超过控件的宽度,即使已经存在水平滚动条,我也无法调整最后一列的大小以使其更宽。其他列可以做得更宽,后续列的宽度不会改变(从而使所有列的总宽度更宽)。

一种解决方法是缩小所有其他列,使总宽度小于控件的宽度,将最后一列增长到我想要的宽度,然后再增加其他列。但显然这是非常乏味和有限的。

我尝试的另一种解决方法是在最后一次之后添加一个虚拟列(如DataGridView White Space After Last Column Header的答案中建议的那样)。然而,虽然现在倒数第二列现在可以增长,但它不会走得太远 - 它仍然受到控件右边界的限制。我可以使空列宽,看起来很丑,或者我可以缩小,在这种情况下我需要多个"去"将最后一列扩展到我想要的宽度,这更加乏味。

我认为另一个问题没有得到满意的答复。答案只给出了为什么会发生这种情况的合理原因,但没有提供解决方案/良好的解决方法。就像其他问题的OP在评论中所说的那样,我们使用的大多数网格都不会遇到这个问题:你可以将列的右边界拖出控件的右边界。似乎只有WinForms DataGridView才会遇到这个问题。

1 个答案:

答案 0 :(得分:0)

您可以使用ColumnWidthChanged事件来检测用户调整最后一列的大小,然后创建边距,让用户感受到更多调整大小的感觉。
请检查我在下面写的代码。
它按预期工作但你必须添加自己的自定义水平滚动条才能滚动datagridview(它应该很简单,datagridview宽度会受到自定义滚动的影响酒吧价值)。
请注意,每次引发事件时都会删除ColumnWidthChanged事件,以防止堆栈溢出,并在宽度更改后再次添加事件。

private void dgvMain_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
    if (IsLoading == true)
        return;

    if (e.Column.Index == dgvMain.Columns.Count-1) 
    {
        dgvMain.ColumnWidthChanged -= dgvMain_ColumnWidthChanged;
        if (dgvMain.Width - GetTotalColumnsWidth() <= 200)
        {
            e.Column.Width = e.Column.Width + 20;
            dgvMain.Width = dgvMain.Width + 40;
        }
        dgvMain.ColumnWidthChanged += new DataGridViewColumnEventHandler(dgvMain_ColumnWidthChanged);
    }
}

private int GetTotalColumnsWidth()
{
    var result = 0;
    for (int i = 0; i < dgvMain.Columns.Count; i++)
    {
        result += dgvMain.Columns[i].Width;
    }

    return result;
}