可重复使用的功能,用于将组合框项目的宽度调整为列表中最长的项目

时间:2016-11-17 14:36:32

标签: vb.net combobox

我的目的是能够使用函数调整下拉列表的宽度,以便显示下拉列表中包含的所有项目(长度方式)。我试图创建一个功能,我可以将它用于多个组合框。目前,这是从LOAD CBO函数调用的,在加载数据之后,它没有调整.dropDownWidth。

Private Sub AdjustCombobox(ByVal comboboxName As ComboBox)
    Dim maxwidth = 0
    Dim temp = 0

    For Each Item As Object In comboboxName.Items
        temp = TextRenderer.MeasureText(Item.ToString(), comboboxName.Font).Width
        If temp > maxwidth Then
            maxwidth = temp
        End If
    Next

    comboboxName.DropDownWidth = maxwidth
End Sub

编辑:

组合框载入功能

        Dim da As New SqlDataAdapter(sql, objconnection)
        Dim ds As New DataSet

        da.Fill(ds, "Prov")

        If ds.Tables("Prov").Rows.Count > 0 Then
            With c
                .DataSource = ds.Tables("Prov")
                .ValueMember = "No"
                .DisplayMember = "Name"
                .SelectedIndex = -1
            End With
        End If

1 个答案:

答案 0 :(得分:1)

首先,我会使用实际的DataSource,而不是项目。这允许一个非常简短的解决方案:

Private Function GetMaxDataSize(dt As DataTable, mem As String) As Int32

    Dim longestItem = dt.AsEnumerable.Select(Function(q) q.Field(Of String)(mem)).
                OrderBy(Function(z) z.Length).
                Last()

    ' assumes as the CBO's use the same Font
    Dim longestSize = TextRenderer.MeasureText(longestItem, cboE.Font)
    Return longestSize.Width +
                SystemInformation.VerticalScrollBarWidth + 5

End Function

请注意,该方法考虑了VerticalScrollBarWidth和一个轻微的软糖因素,以考虑内部装订线,填充,边距等。如果不同的组合使用不同的字体,也将每个字体传递给该方法。用法:

' "Text" is the DisplayMember name / column name
cboE.DropDownWidth = GetMaxDataSize(dtLorem, "Text")

使用“Lorem ipsum dolor”片段,其中一个片段特别长,结果:

enter image description here