2016-07-05 122 views
1

私は、列タイプがDataGridViewComboBoxColumnのDataGridViewに列を持っています。このコンボボックスには、さまざまな長さの複数の文字列があります。これらの文字列の一部は、アプリケーション設定のユーザーが変更できます。DataGridViewの列をコンボボックスの内容に自動サイズ設定するにはどうすればよいですか?

screenshot of column

などAllCells、DataGridViewTextBoxColumnsとうまく仕事として列AutoSizeのオプション、:それは次のようになります。しかし、コンボボックスでは期待通りに動作しません。

この列の幅をコンボボックスの内容に合わせて設定するにはどうすればよいですか?

答えて

1

TextRenderer.MeasureTextを使用してアイテムの幅を計算し、アイテムの幅の最大値に列の幅を設定できます。

カラムの幅を変更するにはWidthカラムのプロパティを使用します。ドロップダウンメニューの幅のみを変更するには、DropDownWidthプロパティを使用します。

// I suppose your column is at index 0 
var c = this.dataGridView1.Columns[0] as DataGridViewComboBoxColumn; 
c.Width = c.Items.Cast<Object>().Select(x => x.ToString()) 
    .Max(x => TextRenderer.MeasureText(x, c.InheritedStyle.Font, 
     Size.Empty, TextFormatFlags.Default).Width); 

あなたは、フォームのLoadイベントハンドラにしたり、列のサイズをリセットすることがあり、他の場所で上記のコードを置くことができます。

注:上記の例のコンボボックスは、文字列型のものとします。しかし、どのようなタイプのアイテムでも使用でき、アイテムのテキストを抽出できます。ここでのポイントは、そのパラメータにTextRenderer.MeasureTextを使用することです。

VBバージョンは

Dim c = DirectCast(Me.DataGridView1.Columns(0), DataGridViewComboBoxColumn) 
c.Width = c.Items.Cast(Of Object)().Select(Function(x) x.ToString()) _ 
      .Max(Function(x) TextRenderer.MeasureText(x, c.InheritedStyle.Font, _ 
       Size.Empty, TextFormatFlags.Default).Width) 
+0

あなたは答え:) –

+0

に関するご質問がある場合は、私に教えてください 'TextRenderer'は、私が行方不明になったクラスの名前でした。それはこれを行う良い方法です。しかし、それは完全ではありません!ドロップダウンの矢印と内部のパディングを無視します。試行錯誤の結果、特定のディスプレイ設定(フォントサイズが14、それ以外のデフォルトはすべて)にはパディングに22ピクセルが追加で必要と判断されました。これでこのプロジェクトには十分です! – kvermeer

+0

はい、パディングなどのスペースを追加する必要があります。['DisplayStyleForCurrentCellOnly'](https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxcolumn)もご覧ください。現在の列のみ(v = vs.110).aspx)の列のプロパティを表示します。現在のセルがこの列にあるとき、 'DisplayStyle'プロパティ値が' DataGridView'コントロール内の現在のセルにのみ適用されるかどうかを示します。 –

関連する問題