none
DataGridView 最小行高さの変更 RRS feed

  • 質問

  • お世話になります

    DataGridView で
    「DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders」プロパティを設定した状態で、
    「DataGridView.Font= new Font( "MS ゴシック", FontSize, FontStyle.Regular, GraphicsUnit.Pixel, (byte)128 )」を設定しています

    この際、DataGridView.Font の FontSize に 12px を設定しているのですが、
    セルの高さがフォントの高さに合わせてリサイズされず、セルに余分な空白ができてしまいます
    (改行を含む場合は問題なく、1行の場合のみ)

    DataGridViewRow.Height のデフォルト高さは 21px で、フォントの高さ+パディングの値が 21px より大きい値を設定した場合はセルの高さは自動的にリサイズされます

    msdn で「行の最小の高さを設定するには、MinimumHeight プロパティを使用します」とあったので、
    DataGridView.RowTemplate.MinimumHeight の値を、デフォルト 9px からより小さな値に変更してみても効果はありませんでした
    (msdn の記述では、既定値は 3px となっているのですが・・・)

     

    DataGridViewCellStyle.WrapMode を設定して改行を含む文字列をセルに設定した状態で、
    さらにカラムヘッダの幅変更でさらに折り返し表示できる前提で、
    セルの最小行高さを変更するにはどうすればよいでしょう?
    (行が追加された際に、デフォルトでフォントサイズに一致した高さになっていてほしい)

     

    ※ DataGridViewRowsAddedEventHandler イベントで行が追加された際に、
    文字列の行数と文字列幅を計算して DataGridViewRow.Height に直接高さを設定した場合は変更できることを確認していますが、
    データ量が多いので文字列幅の計算とカラムヘッダの幅が更新され場合の再計算に時間がかかりすぎてしまいます

     

    環境
    Windows 7 Ultimate 64bit
    VisualStudio 2010 Professional
    .NET Framework 4 RTM

    2010年5月9日 1:31

回答

  • 一応現象は再現しましたが。

      var h3 = this.社員DataGridView.Rows[0].GetPreferredHeight(0, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, true);
      var h4 = this.社員DataGridView.Rows[0].GetPreferredHeight(0, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, false);
    

    この値が20以下にならないので12Fは無理なんじゃないかと思います。

    ソースを確認してみましたが。
    borderWidthsRect.Top(0) + borderWidthsRect.Height(1) + cellStyle.Padding.Vertical(0) + DATAGRIDVIEWCELL_iconMarginHeight(4) * 2 + DATAGRIDVIEWCELL_iconsHeight(11)  = 20 が最低値のようです。

    ただ、DataGridView.RowHeightInfoNeeded イベントで無理やり設定することは可能だと思います。
     http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.rowheightinfoneeded.aspx
    (今実験したらイベントは発生しませんでした)


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク Nymphaea 2010年5月10日 11:29
    2010年5月9日 15:02

すべての返信

  • 私のところでは改行を含む場合1行の場合とも問題なくセルに余分な空白はできません。

    InitializeComponent() 内のコードはこうなっています。

       // 
       // 社員DataGridView
       // 
       this.社員DataGridView.AutoGenerateColumns = false;
       this.社員DataGridView.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;
       this.社員DataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
       this.社員DataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
       this.dataGridViewTextBoxColumn1,
       this.dataGridViewTextBoxColumn2,
       this.dataGridViewTextBoxColumn3,
       this.dataGridViewTextBoxColumn4,
       this.dataGridViewTextBoxColumn5,
       this.dataGridViewTextBoxColumn6,
       this.dataGridViewTextBoxColumn7,
       this.dataGridViewTextBoxColumn8,
       this.dataGridViewTextBoxColumn9,
       this.dataGridViewTextBoxColumn10,
       this.dataGridViewTextBoxColumn11,
       this.dataGridViewTextBoxColumn12,
       this.dataGridViewTextBoxColumn13,
       this.dataGridViewTextBoxColumn14,
       this.dataGridViewTextBoxColumn15,
       this.dataGridViewTextBoxColumn16,
       this.dataGridViewTextBoxColumn17,
       this.dataGridViewTextBoxColumn18,
       this.dataGridViewTextBoxColumn19,
       this.dataGridViewTextBoxColumn20,
       this.dataGridViewTextBoxColumn21});
       this.社員DataGridView.DataSource = this.社員BindingSource;
       dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
       dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;
       dataGridViewCellStyle1.Font = new System.Drawing.Font("MS UI Gothic", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
       dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText;
       dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
       dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
       dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
       this.社員DataGridView.DefaultCellStyle = dataGridViewCellStyle1;
       this.社員DataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
       this.社員DataGridView.Location = new System.Drawing.Point(0, 25);
       this.社員DataGridView.Name = "社員DataGridView";
       this.社員DataGridView.RowTemplate.DefaultCellStyle.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
       this.社員DataGridView.RowTemplate.Height = 21;
       this.社員DataGridView.Size = new System.Drawing.Size(846, 791);
       this.社員DataGridView.TabIndex = 1;
    

     

    コンストラクタでフォントを設定しています。

      public Form1()
      {
       InitializeComponent();
    
       this.社員DataGridView.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(128)));
       //this.社員DataGridView.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(128)));
      }
    

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年5月9日 12:38
  • えムナウ様 返信ありがとうございます

    最初の投稿で、DataGridView.DefaultCellStyle.Alignment プロパティに
    DataGridViewContentAlignment.MiddleLeft ではなく、DataGridViewContentAlignment.TopLeft を設定した場合という条件が書き漏れてしまっていました
    申し訳ありません

    提示していただいたコードに DataGridViewContentAlignment.TopLeft を設定した場合にもセルの下部に空白ができてしまうのを確認できると思いますので、
    これを回避したいというのが質問の内容となります

    以上、よろしくお願いします

    2010年5月9日 12:55
  • 一応現象は再現しましたが。

      var h3 = this.社員DataGridView.Rows[0].GetPreferredHeight(0, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, true);
      var h4 = this.社員DataGridView.Rows[0].GetPreferredHeight(0, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, false);
    

    この値が20以下にならないので12Fは無理なんじゃないかと思います。

    ソースを確認してみましたが。
    borderWidthsRect.Top(0) + borderWidthsRect.Height(1) + cellStyle.Padding.Vertical(0) + DATAGRIDVIEWCELL_iconMarginHeight(4) * 2 + DATAGRIDVIEWCELL_iconsHeight(11)  = 20 が最低値のようです。

    ただ、DataGridView.RowHeightInfoNeeded イベントで無理やり設定することは可能だと思います。
     http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.rowheightinfoneeded.aspx
    (今実験したらイベントは発生しませんでした)


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク Nymphaea 2010年5月10日 11:29
    2010年5月9日 15:02
  • えムナウ様 返信ありがとうございます

    > ソースを確認してみましたが。
    > borderWidthsRect.Top(0) + borderWidthsRect.Height(1) + cellStyle.Padding.Vertical(0) + DATAGRIDVIEWCELL_iconMarginHeight(4) * 2 +
    > DATAGRIDVIEWCELL_iconsHeight(11)  = 20 が最低値のようです。
    貴重な情報をありがとうございます

    やはり、標準で 12f にセルの高さを合わせることはできないようですね・・・

    提示していただいた DataGridView.RowHeightInfoNeeded イベントはわたしも試してみたのですが、イベントの発生を確認できませんでした
    ( DataSource プロパティと VirtualMode プロパティは利用しているのですが・・・)

     

    今回の現象については、DataGridViewRow.Height に直接高さを指定することで対応できるようにしたいと思います

    えムナウ様 ありがとうございました

    2010年5月10日 11:29