データのテーブルがいくつかあるASP.NETWebサイトを開発しています。このデータの画像を生成して、フォーラムでそれらの画像を表示できるようにします(たとえば)。過去に使用したメソッドは非常に単純です。メモリ内に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であると想定しています。したがって、3つの列がある場合、列が実際にはそれぞれ100ピクセルよりもはるかに広い場合でも、グリッドの幅は常に300ピクセルになります。
グリッドを実際にフォームに描画するのではなく、メモリ内にグリッドを作成していることが原因だと思いますか?これでうまくいくと思いますが、どういうわけか、列の幅は常に100です...グリッドと画像の必要な幅を計算する方法がないため、これは私のアイデア全体を役に立たなくします。各列のデータのすべての文字列を測定し、基本的に手動でサイズを変更できると思いますが、実際にはそうではありません...もっと良い方法があるはずですか?
私は何が間違っているのですか?ありがとう!