In einem VB.net-Projekt verwenden ich Kombinationsfelder (ComboBox) zum Auswählen von Werten. Allerdings sind die Werte zum Teil sehr lang und wurden in der Liste nicht mehr komplett angezeigt.

Zwar stellt eine ComboBox die Eigenschaft DropDownWidth zur Verfügung, worüber man die Breite der Liste einstellen kann, aber es gibt leider keine Funktion zum Ermitteln der benötigten Breite.

Im Netz habe ich ein paar Beispiele gefunden, wie man den breitesten Eintrag ermitteln kann, und mir daraus folgenden Code gebaut:

Public Class MyComboBox
    Inherits System.Windows.Forms.ComboBox

    ''' <summary>
    ''' ...
    ''' </summary>
    Public Sub AutoResizeDropDownWidth()
        Dim iWidestWidth As Integer = 0

        Using g As Graphics = Me.CreateGraphics
            For Each oItem As Object In Me.Items 'Für alle Einträge...
                Dim sItemText = Me.GetItemText(oItem)
                Dim oItemSize As SizeF = g.MeasureString(sItemText, Me.Font)

                iWidestWidth = Math.Max(iWidestWidth, oItemSize.Width)
            Next oItem
        End Using

        If Me.Items.Count > Me.MaxDropDownItems Then 'Wenn die Scrollleiste angezeigt wird...
            iWidestWidth += 15
        End If

        Me.DropDownWidth = Math.Max(iWidestWidth, Me.Width)
    End Sub

End Class

Ich leite mir eine MyComboBox von der Original ComboBox ab und füge ihr die Methode AutoResizeDropDownWidth() hinzu. Wenn man diese Methode aufruft, wird die Liste so breit gemacht, dass der breiteste Eintrag (+Scrollleiste) passt, sie aber nicht kleiner wird, als die ComboBox selber.

Der Quelltext funktioniert sowohl wenn man die Einträge über Add() hinzufügt, als auch wenn man mit einer DataSource arbeitet.