winforms - 如何使用水平滚动条使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 行和列换行和自动调整大小,使其不会在空间中抽筋?我希望它动态调整行高并自动显示水平滚动条。
解决方案
我不确定您到底想要实现什么或网格的大小如何开始。用户是否能够“调整”网格或列的大小?目标是设置网格的宽度(达到一定大小)以显示所有列吗?换句话说,与网格和其中的列相关的总体目标是什么。
简而言之……您遇到的问题是因为DataGridView
它不是很聪明。除了给图片添加混乱之外,这里不适用,就是有两(2)个AutoSizeColumnMode
设置……让我试着解释一下……</p>
对于初学者,有两 (2) 个不同的“AutoSizeMode”属性可用于自动调整网格中列的大小,这可能会引起一些混乱。一个是针对整个网格的……AutoSizeColumnMode
它适用于网格……还有一个用于各个列的属性…… AutoSizeMode
。
我相信,无论 GRID'SAutoSizeColumnMode
设置为什么,如果存在冲突,都将覆盖任何单个列设置。示例 IF GRID'SAutoSizeColumnMode
设置为Fill
... THEN,IF... 您将单个列设置为AutoSizeMode
... Fill
THEN... GRID'SFill
设置将被使用。
在大多数情况下,我发现将 GRIDS 自动大小模式设置为NONE
并手动设置各个列的自动大小模式至少是可预测且一致的。
另一个问题是网格不是很智能,并且会很乐意将 100 列数据填充到一个宽度不足以容纳所有列的网格中。每列的最小大小将设置为 5 像素。显然这没有用,因为您看不到数据,但如果设置设置为“填充”并且列太多和/或网格的宽度不够宽,则网格将强制执行此操作。这与您在最后一张图片的第 5 列中看到的类似。
在这种特殊情况下,您发布的代码......</p>
最后一张图片没有显示水平滚动条的原因是因为最后一列(第 5 列)AutoSizeMode
设置为Fill
……并且……网格宽度足够宽,因此第 5 列仍有空间“填充”网格宽度。这就是为什么您看到垂直滚动条但没有水平滚动条的原因,因为网格中的列仍然“适合”...</p>
如果...您使 GRIDS WIDTH 小于前四 (4) 列的宽度,则将显示水平滚动条,但是,如果您向右滚动以查看第 5 列...。第 5 列的宽度大约为 5 个像素,这显然是没有用的,因为我们无法看到任何数据。
我希望以上信息对您有所帮助,并且鉴于您所描述的内容,我猜您正在寻找的是不要将第 5 列设置AutoSizeMode
为Fill
……您想要的是将第 5 列设置AutoSizeMode
为AllCells
.
dataGridView1.Columns["Column 5"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
这将产生如下所示的内容。
请记住,如果网格足够宽并且第 5 列的宽度使得它在最后留下一个间隙,那么您将需要在您的代码中查找它。例如,如果网格宽度大于某个值,那么是的,您想将第 5 列的自动大小模式设置为Fill
,如果它小于某个值,那么您想将其设置为AllCells
。
不幸的是,正如我之前评论的那样,网格不是很智能,如果您希望列以特定方式显示,那么可能需要创建一种方法来检查列并确定为每列提供什么设置。我过去曾这样做过,绕过网格的缺点并不难。
推荐阅读
- r - 根据R中的三个不同组确定坐标
- java - IntelliJ IDEA 远程开发代码“找不到要前往的声明”
- html - 使用 R 将数据框转换为嵌套的 html 文件
- c# - 使用 C# 将文件上传到 CRM 文件字段
- sql - Oracle while exists(select ...) 插入
- swift - 从上传的图像中获取下载 URL - Firebase 和 Swift
- odata - 如何使用 Power Query 从 ProjectServer 访问资源?(我得到一个 DataSource.Error。)
- swiftui - SwiftUI 多张纸:关闭动画损坏
- swift - 从图像中删除像素,然后将它们恢复
- recode - 将李克特量表变量转换为二分法