有没有办法让DataGridView适合colums / rows的宽度和高度?我找到了需要手动计算的解决方案:http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 DataGridView是否真的不支持此功能?
答案 0 :(得分:5)
如果您想根据数据自动调整所有列的大小:
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
答案 1 :(得分:2)
答案 2 :(得分:2)
这是一个很老的问题,被误解为恕我直言。 Idsa想要实现的是使实际的AutoSize
winforms功能与DataGridView一起使用。该属性存在但无效。
这意味着DataGridView必须适合 其内容,而不是其内容必须适合内部 DataGridView。
要实现AutoSize实现,需要考虑很多事情。 DataGridView的大小取决于很多标准:
最好是选择一组适合您特定场景的标准,然后编写一些可以为您计算DataGridView大小的内容。
这里以我的特定场景为例:
我的网格是数据绑定的。因此,每次DataBinding操作完成时,它的大小都应该更改。这是触发重新计算DataGridView大小的条件。所以我把它挂钩到DataBindingComplete
事件。
我的网格不应该显示滚动条。所以我将Scrollbars
属性设置为None。
我的行和列自动调整大小模式设置为AllCells。
行和列标题不可见。如果是,则他们的尺寸必须包含在计算中。
以下扩展方法符合我的需求。这非常简单,因为我的网格非常简单。您可能需要稍微调整一下以使其按预期工作,并使用 lot 使其适用于每个DataGridView场景。
public static void HandleAutoSize(this DataGridView dgv)
{
dgv.DataBindingComplete += (s, e) =>
{
var dg = (DataGridView)s;
var width = dg.Columns.GetColumnsWidth(DataGridViewElementStates.None);
var height = dg.Rows.GetRowsHeight(DataGridViewElementStates.None);
dg.ClientSize = new Size(width, height);
};
}
答案 3 :(得分:1)
线程很旧,但是如果有人现在仍然需要它,他可以使用 grid.AutoResizeColumns() 和我一起很好
答案 4 :(得分:0)
此VB.NET
翻译对我有用:
For i As Integer = 0 To dataGridView.ColumnCount - 1
dataGridView.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
Next
答案 5 :(得分:0)
我编写了这段代码,用像素颜色计算网格的确切大小,并将其与背景进行比较。这对我很有效。如果在包含的表单上使用自动调整大小,则会导致一些闪烁,您必须禁用自动调整大小或修改代码以手动设置包含表单上的大小。但是,如果没有在父控件上自动调整大小,它就能完美运行。
private void gridViewAutoSize(DataGridView dgv)
{
Bitmap dgvBmp = new Bitmap(dgv.Width,dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
int x = dgv.Width-1;
int y = dgv.Height-1;
int halfHeaderW = dgv.RowHeadersWidth / 2;
int halfHeaderH = dgv.ColumnHeadersHeight / 2;
int borderX = 0;
int borderY = 0;
const int widthLimit = 800;
const int heightLimit = 350;
while (x == dgv.Width - 1)
{
borderX = 0;
while (x >= 0 && dgvBmp.GetPixel(x, halfHeaderH).ToArgb() != dgv.BackgroundColor.ToArgb())
{
borderX++;
x--;
}
if (x < 0)
{
if(dgv.Width-1 <= widthLimit)
{
dgv.Width += 100;
dgvBmp = new Bitmap(dgv.Width, dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
x = dgv.Width - 1;
}
else
{
x = widthLimit;
borderX = 0;
}
}
}
if (x > widthLimit)
{
x = widthLimit;
borderX = 0;
}
else if(x < widthLimit)
{
while (dgvBmp.GetPixel(x, halfHeaderH).ToArgb() == dgv.BackgroundColor.ToArgb())
{
x--;
}
}
while (y == dgv.Height - 1)
{
borderY = 0;
while (y >= 0 && dgvBmp.GetPixel(halfHeaderW, y).ToArgb() != dgv.BackgroundColor.ToArgb())
{
borderY++;
y--;
}
if (y < 0)
{
if (dgv.Height-1 <= heightLimit)
{
dgv.Height += 100;
dgvBmp = new Bitmap(dgv.Width, dgv.Height);
dynRecDataGridView.DrawToBitmap(dgvBmp, new Rectangle(0, 0, dgv.Width, dgv.Height));
y = dgv.Height - 1;
}
else
{
y = heightLimit;
borderY = 0;
}
}
}
if (y > heightLimit)
{
y = heightLimit;
borderY = 0;
}
else if (y < heightLimit)
{
while (dgvBmp.GetPixel(halfHeaderW, y).ToArgb() == dgv.BackgroundColor.ToArgb())
{
y--;
}
}
dgv.Size = new Size(x+borderX+1, y+borderY+1);
}
答案 6 :(得分:-1)
您只需将dataGridView属性更改为
即可dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;