2

データのテーブルがいくつかある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です...グリッドと画像の必要な幅を計算する方法がないため、これは私のアイデア全体を役に立たなくします。各列のデータのすべての文字列を測定し、基本的に手動でサイズを変更できると思いますが、実際にはそうではありません...もっと良い方法があるはずですか?

私は何が間違っているのですか?ありがとう!

4

1 に答える 1

1

col.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true) を使用してくださいこれは、(少なくとも私にとっては) 期待する幅を返すようです。

于 2014-04-01T19:30:02.503 に答える