有没有办法让DataGridView适应列/行的宽度和高度?我找到了需要手动计算的解决方案:http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 DataGridView真的不支持此功能吗?
如果您想让所有列根据数据自动调整大小:
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
VB.NET
片段,然后意识到它应该只是一个额外的答案。 - twipAutoSize
winforms特性与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);
};
}
BeginInvoke(Sub() AdjustDGVSize())
来等待大小实际改变。其中AdjustDGVSize()
是设置dgv客户端大小的子程序。我还将不可见列的宽度设置为6像素。 - ourmandave这个 VB.NET
的翻译对我很有用:
For i As Integer = 0 To dataGridView.ColumnCount - 1
dataGridView.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
Next
这个帖子已经很老了,但是如果有人现在仍然需要它,他可以使用grid.AutoResizeColumns(),在我这里运行良好。
Original Answer翻译成"最初的回答"
我编写了这段代码来计算网格的精确大小,使用像素颜色并将其与背景进行比较。对我来说效果很好。如果您在包含表单上使用自动调整大小,则会导致一些闪烁,您必须禁用自动调整大小或修改代码以手动设置包含表单的大小。但是,在父控件上没有自动调整大小时,它可以完美地工作。
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);
}
dynRecDataGridView
? - PeterCoSystem.Windows.Forms.DataGridView
类,通过 IDE UI 工具箱放置在表单上,并命名为 'dynRecDataGridView',https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview?view=netframework-4.8 - Motomotes你可以直接更改dataGridView的属性为
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;