我正在开发一个ASP.NET网站,其中包含一些数据表。我想生成这些数据的图像,以便我可以在论坛上显示这些图像(例如)。我在过去使用的方法非常简单:我在内存中创建一个System.Windows.Forms.DataGridView控件(是,winforms控件!),设置它的样式,加载一些列和行,然后使用它的DrawToBitmap方法生成一个图像(基本上是控件的“截图”)。DataGridView - 获取实际列宽
例子:
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属性得到总的宽度,然后遍历行,并添加自己的身高属性来获取总高度:
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;
}
虽然...每个列的宽度属性总是返回100,但我认为这是列的(默认)MinimumWidth而不是列的实际宽度。因此,对于三列,我的网格始终是300像素宽,即使列实际上比每个像素的宽度都大得多。
我猜这是由于我在内存中创建网格而不是实际将其绘制到某个窗体这一事实造成的?我相信这应该起作用,但由于某些原因,无论我做什么,列宽总是100 ......这使得我的整个想法变得无用,因为我无法计算网格和图像的必要宽度。我想我可以测量每列中的所有数据字符串,并基本调整它们的大小,但我真的宁愿不要......必须有更好的方法?
我在做什么错? 谢谢!
嗨,我有同样的问题,col.Width总是给100px。你找到了解决这个问题的方法吗? – Voreno 2014-03-21 00:56:07
来自BOS的这个答案可能会覆盖它http://stackoverflow.com/questions/7412098/fit-datagridview-size-to-rows-and-columnss-total-size/21116246#comment62652568_21116246 – barlop 2016-06-04 19:40:06