我的目的是能够使用函数调整下拉列表的宽度,以便显示下拉列表中包含的所有项目(长度方式)。我试图创建一个功能,我可以将它用于多个组合框。目前,这是从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
答案 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”片段,其中一个片段特别长,结果: