我正在開發一個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