【问题标题】:How to make datagridview row height auto adjust/wrap dynamically with a horizontal scroll bar?如何使用水平滚动条使datagridview行高自动调整/换行?
【发布时间】:2021-08-31 02:26:37
【问题描述】:

用户界面:

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;
        }

结果:

如果我通过 Visual Studio 设计器减小 gridview 的大小并重新启动应用程序,则不会显示水平条。

用户界面:

输出:

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

【问题讨论】:

  • 你能举例说明你所描述的吗?
  • 只是一个普通的datagridview,上面的代码我已经贴好了。
  • 在我使用发布的代码进行的测试中,如果列调整大小使得列超出网格的大小,则水平滚动条会按预期显示。你能发一个 minimal reproducible example 来证明这一点吗?
  • 除了默认设置之外,您是否对 datagridview 进行任何其他设置?
  • 没有。我创建了一个DataTable 添加了几列并将其设置为DataSource 到网格。然后执行您发布的代码。授予“同时”在“自动调整大小”列中键入的权限,在用户按下回车键或离开单元格之前,该列不会扩展。我只能猜测这可能就是您所描述的。

标签: winforms datagridview


【解决方案1】:

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

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

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

我相信,无论 GRID 的 AutoSizeColumnMode 设置如何,如果发生冲突,都将覆盖任何单个列设置。示例 IF GRID 的 AutoSizeColumnMode 设置为 Fill... THEN,IF... 您将单个列的 AutoSizeMode 设置为 Fill 以外的其他值... THEN... 将使用 GRID 的 Fill 设置。

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

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

在您发布的代码的这种特殊情况下......

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

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

我希望以上信息对您有所帮助,鉴于您所描述的内容,我猜您正在寻找的是不要将第 5 列的 AutoSizeMode 设置为 Fill... 您想要的是将第 5 列的 AutoSizeMode 设置为 @ 987654339@.

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

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

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

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

【讨论】:

  • 进行您建议的更改会导致 gridview 需要很长时间才能加载
  • 嗯……您的问题的标题是……“如何使用水平滚动条使 datagridview 行高自动调整/自动换行?”……? ……我觉得我的回答至少解释了“为什么”水平滚动没有显示……。现在……根据您的评论……我的解决方案……“导致 gridview 需要很长时间才能加载”……? ......我想我不明白你的问题。对不起,如果我错过了什么。祝你好运
猜你喜欢
  • 2020-01-29
  • 2011-04-26
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
相关资源
最近更新 更多