真正的答案
我编写了这段代码来使用像素颜色计算网格的确切大小并将其与背景进行比较。这对我很有效。如果在包含表单上使用自动调整大小会导致一些闪烁,您必须禁用自动调整大小或修改代码以手动设置包含表单的大小。但是,如果没有在父控件上自动调整大小,它可以完美地工作。
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);
}