2009-07-23 5 views
1

私はWinFormsコンボボックスを持っています。選択したアイテムをすべて表示できるようにカラムボックスの幅を設定します。 (私は、ソフトウェアの作成時にコンボボックスに表示される項目がわからない)コンボボックスがすべてのリストアイテムを表示するために必要なスペースを見つけるには

しかし、私がCombobox.PreferredSizeを呼び出すと、ドロップダウンリストにある項目は考慮されていないようだ。

+0

ちょうどあなたが画面の端を持っている場所を知っていることを確認してください。コンボボックスを画面外の領域に広げることで、コンボボックスを簡単に使用できなくすることができます。 –

+0

申し訳ありません私の質問があまり明確でない場合、リストが閉じられたときに、選択されたアイテムを完全に見ることができるようにしたいと思います。 –

答えて

1

System.Drawing.Graphics.MeasureStringメソッドを使用できます。リスト内の最も広いアイテムを見つける方法の詳細についてはthis answerをご覧ください。与えられたフォントの文字列の幅を測定することでトリックを行いますSystem.Drawing.Graphis.MeasureStringまたは他の(高速)代替TextRenderer.MeasureTextを使用

private void ResizeComboBox(ComboBox comboBox) { 
    var maxItemLength = 0; 
    // using the ComboBox to get a Graphics object: 
    using (var g = Graphics.FromHwnd(comboBox.Handle)) { 
    foreach (var item in comboBox.Items.Cast<string>()) { 
     var itemLength = g.MeasureString(item, comboBox.Font); 
     maxItemLength = Math.Max((int) itemLength.Width, maxItemLength); 
    } 
    } 
    // correction for the drop down arrow 
    maxItemLength += 15; 
    comboBox.Width = maxItemLength; 
} 
+0

ありがとう、しかし私はどのように広範囲に対処するために追加すると一致し、矢印などをドロップダウン? (コンボボックスの描画方法は、Winformsが動作しているOSによって異なります) –

+0

+ = 15は高DPIディスプレイなどを考慮していますか? –

+0

いいえ、それはVista上でうまくいく値ですが、私は他のOSでそれをテストしていません。 「高DPIディスプレイ」とはどういう意味ですか?ポイントはWindowsフォームの画面サイズに関係なく一定ですので、問題はありません。あなたがサポートしたいすべてのOSの下で最大の修正を見つけて、その値を使用してください。 HTH。 –

2

。アイテムのリスト内のすべてのアイテムの最大幅を取得し、コントロールの幅をその最大値に設定するだけです。

そうするためのアルゴリズムは次のとおりです。

using (Graphics g = comboBox.CreateGraphics()) 
{ 
    float maxWidth = comboBox.Width; 

    foreach(string s in comboBox.Items) 
    { 
     SizeF size = g.MeasureString(s, comboBox.Font); 
     if (size.Width > maxWidth) 
      maxWidth = size.Width; 
    } 
} 

comboBox.Width = maxWidth; 
+0

ありがとう、しかし私はどのように広範囲に対処するために追加すると一致し、矢印などをドロップダウン? (コンボボックスの描画方法は、Winformsが動作しているOSによって異なります) –

+1

System.Windows.Forms.SystemInformationクラスを参照して、幅や高さなどのUIメトリックを多数記述するか、 GetSystemMetrics SM_CXVSCROLLプロパティを使用したWin32 APIメソッド呼び出し。 –

+0

また、ドロップダウン矢印の幅に「this feels right」という値を実際に追加することはできません。ユーザーはその幅をカスタマイズできます。これが、SystemInformationとGetSystemMetricsが間違いなく助けになる場所です。 –

関連する問題