2009-07-15 21 views
1

私は与えられた幅のコンボボックスを持っています。 データの1行が部分的に隠れている(コンボボックスが狭すぎる可能性があります)場合があります。私はツールチップまたは右クリックのコンテキストメニューを使用して、行全体を表示したいと思います。@ VB.NETのコンボボックスアイテムにツールチップを設定するには?

現在、私が現在持っているか、マウスで渡している行を「キャッチ」する方法が見つかりません。教えてください。

ありがとうございます!

答えて

2

すべてが表示されるようにDropDownWidthプロパティを増やしてみましたか?

編集:リスト内の項目に基づいて理想的な幅を検索するには:

var maxLength = 0; 
// using the ComboBox to get a Graphics object: 
using (var g = Graphics.FromHwnd(comboBox2.Handle)) { 
    foreach (var item in comboBox2.Items.Cast<string>()) { 
    var itemLength = g.MeasureString(item, comboBox2.Font); 
    maxLength = Math.Max((int) itemLength.Width, maxLength); 
    } 
} 
if (comboBox2.Items.Count > comboBox2.MaxDropDownItems) { 
    // correction when ScrollBar is displayed 
    maxLength += 15; 
} 
comboBox2.DropDownWidth = maxLength; 

私はテストのためComboBoxDropDownイベントにこのコードを置きます。 ComboBox ...

+0

ありがとう、私はこのプロパティを知らなかった。今質問は、最も長いデータの幅を知る方法です。 –

+1

テキストを測定するには、System.Drawing.Graphics.MeasureStringメソッドを見てください。 – hometoast

+1

注:この例は、ComboBox内の項目が文字列の場合にのみ機能します。データバインディングのためにコンボボックス内の項目が文字列以外の場合は、.Cast ()が項目のデータ型に一致するように更新され、.MeasureString()で項目のプロパティを測定する必要があります。コンボボックスのDisplayMember。 – ckittel

0

あなたの権利は実際には「Item.OnMouseOver」ではありませんが、私はあなたがコンボボックスから頭部、私はおそらく何かを忘れてしまった)...

  • 継承、
  • オーバーライドOnDrawItem(あなたは「所有者が描画」に変更.DrawModeをオンにする必要があるかもしれません)。
    • あなたは、どのアイテムがEventArgsのOnDrawItemイベント/オーバーライドに配置されているかを知ることができます。
  • その時点でツールチップをコントロールに設定します。
  • 上記が自動的に機能しない場合、手動でツールチップを表示するようにタイマを設定することもできます。
1

Julienと同じ方向に行くと、ここでは、コンボボックスがどのように満たされているか(手動で文字列またはデータバインディングを介して)ドロップダウン領域のサイズを変更する一般的な拡張メソッドがあります。

<Extension()> _ 
Public Sub AutosizeDropDownWidth(ByVal combobox As ComboBox) 
    Dim longestItem As Integer = 0 
    Using g = Graphics.FromHwnd(combobox.Handle) 
     Dim itemsAsText = (From item In combobox.Items _ 
          Select combobox.GetItemText(item)) 
     longestItem = CInt(itemsAsText.Max(Function(text) g.MeasureString(text, combobox.Font).Width)) 
    End Using 

    ' Account for scrollbar 
    If (combobox.Items.Count > combobox.MaxDropDownItems) Then longestItem += 15 

    ' Resize as needed (but never smaller than the default width) 
    combobox.DropDownWidth = Math.Max(longestItem, combobox.Width) 
End Sub 

それを使用するには、あなたは、単に以下...

Private Sub MyCombobox_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyCombobox.DropDown 
    MyCombobox.AutosizeDropDownWidth() 
End Sub 

注を行うことができますが、私はこのコード例では、空のコンボボックスのようなコーナーケースをテストしていません。

+2

拡張メソッドとしてはるかに良い、ありがとう!スクロールバーの幅に15の代わりにSystemInformation.VerticalScrollBarWidthを使用することができます。 – Darryl

関連する問題