2016-11-17 68 views
0

我的目的是能够使用一个函数来调整下拉的宽度,以便下拉列表中包含的所有项目都显示出来(长度明智的)。我试图创建一个函数,我可以将它用于多个组合框。目前,这是从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 

编辑:

comboboxload功能

 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 
+2

下拉的宽度是独立的:你在找'.DropDownWidth' ? – Plutonix

+0

是的,我只是想出了这一个 - 对不起@plutonix - 更新了问题 – BobSki

+0

此外,请不要把lang标签放在您的标题 – Plutonix

回答

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存有悲”片段,其中一个特别长一个,结果:

enter image description here

+0

@这似乎与DataTable很好 - 但它不适用于数据集:/ – BobSki

+1

DataSet不包含数据 - 它是DataTable持有者。通过'myDS。表(“Lorem”)' – Plutonix

+0

它说作为enumerable不是system.data.dataTable的成员 - 我有imports.system.data – BobSki

相关问题