首页 > 解决方案 > 如何使用水平滚动条使datagridview行高自动调整/换行?

问题描述

用户界面:

在此处输入图像描述

Btn 点击代码:

private void button1_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Column 1");
            dt.Columns.Add("Column 2");
            dt.Columns.Add("Column 3");
            dt.Columns.Add("Column 4");
            dt.Columns.Add("Column 5");

            DataRow dr = dt.NewRow();
            dr["Column 1"] = "Col1 Test";
            dr["Column 2"] = "Col2 Test";
            dr["Column 3"] = "Col3 Test";
            dr["Column 4"] = "Col4 Test";
            dr["Column 5"] = "Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test ";
            dt.Rows.Add(dr);

            dataGridView1.DataSource = dt;
            dataGridView1.Columns["Column 5"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
            dataGridView1.Columns["Column 5"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }

结果:

在此处输入图像描述

如果我通过视觉工作室设计器减小 gridview 的大小并重新启动应用程序,则不会出现水平条。

用户界面:

在此处输入图像描述

输出:

在此处输入图像描述

如何使 datagridview 行和列换行和自动调整大小,使其不会在空间中抽筋?我希望它动态调整行高并自动显示水平滚动条。

标签: winformsdatagridview

解决方案


我不确定您到底想要实现什么或网格的大小如何开始。用户是否能够“调整”网格或列的大小?目标是设置网格的宽度(达到一定大小)以显示所有列吗?换句话说,与网格和其中的列相关的总体目标是什么。

简而言之……您遇到的问题是因为DataGridView它不是很聪明。除了给图片添加混乱之外,这里不适用,就是有两(2)个AutoSizeColumnMode设置……让我试着解释一下……</p>

对于初学者,有两 (2) 个不同的“AutoSizeMode”属性可用于自动调整网格中列的大小,这可能会引起一些混乱。一个是针对整个网格的……AutoSizeColumnMode它适用于网格……还有一个用于各个列的属性…… AutoSizeMode

我相信,无论 GRID'SAutoSizeColumnMode设置为什么,如果存在冲突,都将覆盖任何单个列设置。示例 IF GRID'SAutoSizeColumnMode设置为Fill... THEN,IF... 您将单个列设置为AutoSizeMode... FillTHEN... GRID'SFill设置将被使用。

在大多数情况下,我发现将 GRIDS 自动大小模式设置为NONE并手动设置各个列的自动大小模式至少是可预测且一致的。

另一个问题是网格不是很智能,并且会很乐意将 100 列数据填充到一个宽度不足以容纳所有列的网格中。每列的最小大小将设置为 5 像素。显然这没有用,因为您看不到数据,但如果设置设置为“填充”并且列太多和/或网格的宽度不够宽,则网格将强制执行此操作。这与您在最后一张图片的第 5 列中看到的类似。

在这种特殊情况下,您发布的代码......</p>

最后一张图片没有显示水平滚动条的原因是因为最后一列(第 5 列)AutoSizeMode设置为Fill……并且……网格宽度足够宽,因此第 5 列仍有空间“填充”网格宽度。这就是为什么您看到垂直滚动条但没有水平滚动条的原因,因为网格中的列仍然“适合”...</p>

如果...您使 GRIDS WIDTH 小于前四 (4) 列的宽度,则将显示水平滚动条,但是,如果您向右滚动以查看第 5 列...。第 5 列的宽度大约为 5 个像素,这显然是没有用的,因为我们无法看到任何数据。

我希望以上信息对您有所帮助,并且鉴于您所描述的内容,我猜您正在寻找的是不要将第 5 列设置AutoSizeModeFill……您想要的是将第 5 列设置AutoSizeModeAllCells.

dataGridView1.Columns["Column 5"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

这将产生如下所示的内容。

在此处输入图像描述

请记住,如果网格足够宽并且第 5 列的宽度使得它在最后留下一个间隙,那么您将需要在您的代码中查找它。例如,如果网格宽度大于某个值,那么是的,您想将第 5 列的自动大小模式设置为Fill,如果它小于某个值,那么您想将其设置为AllCells

不幸的是,正如我之前评论的那样,网格不是很智能,如果您希望列以特定方式显示,那么可能需要创建一种方法来检查列并确定为每列提供什么设置。我过去曾这样做过,绕过网格的缺点并不难。


推荐阅读