我正在开发一个ASP.NET网站,其中有一些数据表。我想生成这些数据的图像,以便我可以在论坛上显示这些图像(例如)。我过去使用的方法非常简单:我在内存中创建一个System.Windows.Forms.DataGridView控件(是的,winforms控件!),设置样式,加载一些列和行,然后使用其DrawToBitmap方法生成图像(基本上是控件的“屏幕截图”)。
示例:
private static Image WriteGrid(List<object[]> data)
{
var grid = new DataGridView();
grid.Columns.Add("Column 1", "Column 1");
grid.Columns.Add("Column 2", "Column 2");
grid.Columns.Add("Column 3", "Column 3");
// Ensure columns are large enough to display all data
grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
foreach (var row in data)
grid.Rows.Add(row);
var width = GetWidth(grid);
var height = GetHeight(grid);
grid.Width = width;
grid.Height = height;
var bmp = new Bitmap(width, height);
grid.DrawToBitmap(bmp, grid.Bounds);
bmp.Save(Util.Server.MapPath("~/Images/grid.png"), ImageFormat.Png);
return bmp;
}
这非常有效,但是我在计算应该生成的图像的大小以及DataGridView控件本身的大小时遇到了问题。默认情况下,它是100x100(我认为)因此切断了大部分数据,这对于图像生成没用,因为你无法显然滚动图像......
所以我想计算DataGridView的宽度和高度,以便它可以显示没有滚动条的所有数据。
我认为这很简单:遍历列并添加它们的Width属性以获得总宽度,然后遍历行并添加它们的Height属性以获得总高度:
private static int GetWidth(DataGridView grid)
{
int width = 0;
foreach (DataGridViewColumn col in grid.Columns)
{
width += col.Width;
}
return width;
}
private static int GetHeight(DataGridView grid)
{
int height = grid.ColumnHeadersHeight;
foreach (DataGridViewRow row in grid.Rows)
{
height += row.Height;
}
return height;
}
这里遇到了麻烦......但是每列的Width属性总是返回100,我假设是列的(默认)MinimumWidth而不是列的实际宽度。因此,对于三列,我的网格总是300像素宽,即使列实际上宽得多于每个100像素。
我猜它是由于我在内存中创建网格而不是实际将其绘制到某个窗体这一事实引起的?我相信这应该可以工作,但出于某种原因无论我做什么,列宽总是100 ...这使我的整个想法无用,因为我没有办法计算网格和图像的必要宽度。我想我可以测量每列中的所有数据字符串,并基本上手动调整它们的大小,但我真的不愿意......必须有更好的方法吗?
我做错了什么? 谢谢!
答案 0 :(得分:1)
使用col.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells,true) 这似乎会返回您期望的宽度(至少对我而言)。