none
DataGridViewの最大列数、最大行数について RRS feed

  • 質問

  • DataGridViewを作成する際の最大列数、最大行数って幾つなんでしょうか。
    MSDNを見ていてもそれらしき記述を見つけられませんでした。
    1000*1000なんていう大きさでも可能なのか、やってみるとFillWeightの
    合計が65535を超えられないというエラーが出ます。
    このエラーの意味もよくわからないのですが、最大列数や最大行数はどうや
    って求めればよいのでしょうか?

    よろしくお願いします。
    2009年10月29日 0:31

回答

  • デフォルトでFillWeightが100という事は65535/100の数だけしかセルが作れないという
    意味なのでしょうか。・・でもそれだと少なすぎておかしいですよね。
    そういう意味になります。以下によるとパフォーマンスの問題による制限のようです。Excelも大きな表になると自動計算を停止しておかないとセルを編集する度に全体が再計算され、かなり時間がかかるようになります。

    FillWeight and binding (DataGridView)
    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/bd291e0c-dee8-45c1-bee1-54509fdf3c4f

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク shimpo 2009年10月29日 1:41
    2009年10月29日 1:39
    モデレータ
  • 実験しました。
    1000 列の FillWeight 合計 49609 にして
    行追加は 2行以上できました。(10行くらい追加しても問題なし。)

            private void Form1_Load(object sender, EventArgs e)
            {
                //列が自動的に作成されないようにする
                dataGridView1.AutoGenerateColumns = false;
                //データソースを設定する
                dataGridView1.DataSource = bindingSource1;

                float fwSum = 0; //FillWeight の合計。(確認用)

                //列を追加する
                for (int i = 1; i <= 1000; i++)
                {
                    //DataGridViewTextBoxColumn列を作成する
                    DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
                    //データソースの"Column1"をバインドする
                    textColumn.DataPropertyName = "Column1";
                    //名前とヘッダーを設定する
                    textColumn.Name = "Column1";
                    textColumn.HeaderText = "Column1";
             //FillWeight 100 のままだと 1000列で 65536 を超えてしまうため調整。
                    Single fw = Single.Parse((i/10).ToString()); // i の 10分の1にする。
                    if (fw == 0) fw = 1; //0→1
                    textColumn.FillWeight = fw;
                    fwSum += fw;
                    System.Diagnostics.Debug.WriteLine(i.ToString() + ", " + fw.ToString());

                    dataGridView1.Columns.Add(textColumn);
                }
                System.Diagnostics.Debug.WriteLine(fwSum);
            }

    FillWeight は比率ということなのでとりあえず均等にしておけばよいのではないでしょうか。
    比率なので最大値はあまり意味がなく、都合のよいところで 65536 にしてあるのでしょう。
    デフォルトの 100 で割ると 655列で、“デフォルトのまま使っても列数は十分問題なし”という親切設計に感じました。

    • 編集済み anningo 2009年10月29日 2:13 言い回し変更。
    • 回答としてマーク shimpo 2009年10月29日 2:14
    2009年10月29日 2:08

すべての返信

  • 限界値はわかりませんが、下記サイトを参考にすると
    条件によっては 1000列でも大丈夫みたいですね。
    1000行は、1行のデータ量がやたら大きくなければたぶん問題ないかと。

    DataGridViewColumnのFillWeightプロパティについて
    http://social.msdn.microsoft.com/forums/ja-JP/vbexpressja/thread/a9ea4605-deef-4de6-ab89-917441d7a666

    DataGridViewColumn.FillWeight プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewcolumn.fillweight(VS.80).aspx

    2009年10月29日 0:39
  • このFillWeightについてはMSDNにも記載があったのは知ってますが、列の幅を示す値
    というのが65535を超えられないというエラーの意味がわかりません。
    デフォルトでFillWeightが100という事は65535/100の数だけしかセルが作れないという
    意味なのでしょうか。・・でもそれだと少なすぎておかしいですよね。
    実際に必要な列数は1000以下ではあるんですが、行数はExcelのように大量に必要なの
    で、このエラーに引っかかって悩んでいます。
    2009年10月29日 1:08
  • セル数(というか行数)は FillWeight に影響しないとおもいました。(いま実験中です。)
    FillWeight は、、、
    方法 : Windows フォーム DataGridView コントロールのサイズ変更モードを設定する
    http://msdn.microsoft.com/ja-jp/library/fd004dhd(VS.80).aspx
    フォームのサイズを変更します。FillWeight プロパティ値で指定した比率を維持しながら、塗りつぶしモードの列の幅が変化するようすを確認します。フォームが小さすぎる場合に、列の MinimumWidth によって列の変更が妨げられるようすを確認します。
    • 回答としてマーク shimpo 2009年10月29日 1:41
    • 回答としてマークされていない shimpo 2009年10月29日 2:15
    2009年10月29日 1:36
  • デフォルトでFillWeightが100という事は65535/100の数だけしかセルが作れないという
    意味なのでしょうか。・・でもそれだと少なすぎておかしいですよね。
    そういう意味になります。以下によるとパフォーマンスの問題による制限のようです。Excelも大きな表になると自動計算を停止しておかないとセルを編集する度に全体が再計算され、かなり時間がかかるようになります。

    FillWeight and binding (DataGridView)
    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/bd291e0c-dee8-45c1-bee1-54509fdf3c4f

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク shimpo 2009年10月29日 1:41
    2009年10月29日 1:39
    モデレータ
  • 実験しました。
    1000 列の FillWeight 合計 49609 にして
    行追加は 2行以上できました。(10行くらい追加しても問題なし。)

            private void Form1_Load(object sender, EventArgs e)
            {
                //列が自動的に作成されないようにする
                dataGridView1.AutoGenerateColumns = false;
                //データソースを設定する
                dataGridView1.DataSource = bindingSource1;

                float fwSum = 0; //FillWeight の合計。(確認用)

                //列を追加する
                for (int i = 1; i <= 1000; i++)
                {
                    //DataGridViewTextBoxColumn列を作成する
                    DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
                    //データソースの"Column1"をバインドする
                    textColumn.DataPropertyName = "Column1";
                    //名前とヘッダーを設定する
                    textColumn.Name = "Column1";
                    textColumn.HeaderText = "Column1";
             //FillWeight 100 のままだと 1000列で 65536 を超えてしまうため調整。
                    Single fw = Single.Parse((i/10).ToString()); // i の 10分の1にする。
                    if (fw == 0) fw = 1; //0→1
                    textColumn.FillWeight = fw;
                    fwSum += fw;
                    System.Diagnostics.Debug.WriteLine(i.ToString() + ", " + fw.ToString());

                    dataGridView1.Columns.Add(textColumn);
                }
                System.Diagnostics.Debug.WriteLine(fwSum);
            }

    FillWeight は比率ということなのでとりあえず均等にしておけばよいのではないでしょうか。
    比率なので最大値はあまり意味がなく、都合のよいところで 65536 にしてあるのでしょう。
    デフォルトの 100 で割ると 655列で、“デフォルトのまま使っても列数は十分問題なし”という親切設計に感じました。

    • 編集済み anningo 2009年10月29日 2:13 言い回し変更。
    • 回答としてマーク shimpo 2009年10月29日 2:14
    2009年10月29日 2:08
  • わざわざ実験までして頂いてありがとうございます。
    参考にしてやってみます。
    2009年10月29日 2:16