组合框项目 - 显示列表成员(字符串)?

时间:2016-01-26 17:31:03

标签: vb.net list combobox

我的项目是在Visual Basic中。我正在尝试创建一个自定义&可爱的"过滤器"对于使用多个TextBox的DataGridView。现在,添加到组合框的任何List(Of String)在框中显示为(Collection)。我希望我的用户能够选择他们创建的用户,因此我希望列表具有可在组合框中选择的显示名称。这是一些代码。

System.setProperty("webdriver.chrome.driver", "/Users/xyz/abc/chromedriver_mac_2.20");

是否可以为List添加显示名称?

3 个答案:

答案 0 :(得分:1)

或者如果你懒惰,请使用buid-in泛型类Tuple From MSDN

创建Tuple(Of String, List(Of String))的集合,并使用@Plutonix建议的方法将绑定集合到ComboBox

Dim savedFilter As New List(Of Tuple(Of String, List(Of String)))()
savedFilter.Add(
    Tuple.Create("default",
                 New List From {"filter1", "filter2", "filter3"}))
savedFilter.Add(
    Tuple.Create("Blue ones", 
                 New List From {"filter4", "filter5"}))
savedFilter.Add(
    Tuple.Create("Old ones", 
                 New List From {NameTextBox.Text, AgeTextBox.Text, NotesTextBox.Text}))

With ComboBoxSavedFilters
    .DisplayMember = "Item1" 'Name of first property in Tuple type
    .ValueMember = "Item2" 'Name of second property in Tuple type -List 
    .DataSource = savedFilter       
End With

然后SelectedValue将包含当前选定的过滤器集合, 可以像那样访问

Dim filter As List(Of String) =
    DirectCast(Me.ComboBoxSavedFilters.SelectedValue, List(Of String))

答案 1 :(得分:0)

您可以在My.Settings下设置StriingCollection enter image description here

初始化(如果需要,可以省略添加的项目)

If My.Settings.Filters Is Nothing Then
    My.Settings.Filters = New StringCollection() From {"One", "Two"}
End If

在ComboBox中设置项目

ComboBox1.Items.AddRange(My.Settings.Filters.Cast(Of String).ToArray)

添加项目

My.Settings.Filters.Add(Now.ToShortDateString)

您也可以删除和清除项目。

答案 2 :(得分:0)

为列表(字符串)提供显示成员

显然,这些过滤器集合不是一个过滤器的标准或子句集合:

I condensed the code in the question, but there are 14 fields that can be filtered and there are multiple filters that can be applied on one field.

对于每个字段的倍数,我不确定我是否希望单独存储这些,但是将字段标准保持在一起。因此,如果您想为这些应用名称,类不仅可以帮助管理过滤元素,还可以帮助管理过滤元素:

Public Class SuperFilter
    Public Property Name As String
    Public Property Elements As SortedList

    Public ReadOnly Property FilterText As String
        Get
            Return GetFilterText()
        End Get
    End Property

    Public Sub New(n As String)
        Name = n
        Elements = New SortedList
    End Sub

    Public Sub AddItem(filter As String)
        Elements.Add(Elements.Count, filter)
    End Sub

    Public Sub InsetAt(index As Int32, filter As String)
        Elements.Add(index, filter)
    End Sub

    Private Function GetFilterText() As String
        Dim els(Elements.Count - 1) As String
        Elements.Values.CopyTo(els, 0)

        Return String.Join(" ", els)
    End Function

    Public Overrides Function ToString() As String
        Return String.Format("{0} ({1})", Name, Elements.Count.ToString)
    End Function
End Class

您需要添加RemoveCount等方法和属性,但这应该足以证明。我不确定SortedListDictionary使用字段名称可能会更好,但控制顺序的东西似乎值得。我也不确定我会公开Elements集合 - 管理它可能最好留给全班。

希望Combo显示一组这些(与过滤元素/子句相对)是目标。

Private filters As New List(Of SuperFilter)

将过滤条目添加到列表中:

Dim item As New SuperFilter("Default")
item.AddItem("Id = 7")
filters.Add(item)

item = New SuperFilter("Blue Ones")
item.AddItem("Color = Blue")
filters.Add(item)

item = New SuperFilter("Complex")
item.AddItem("[Name] like %Bob% OR [Name] like %Alice%")
item.AddItem("AND Color = 'Blue'")
item.AddItem("AND Active=True")
item.AddItem("AND AccessRequired < 3")
item.AddItem("AND DateAdded > #2/11/2010#")
item.AddItem("AND CreatedBy = 'ziggy'")
filters.Add(item)

cbo1.DataSource = filters
cbo1.DisplayMember = "Name"
cbo1.ValueMember = "FilterText"

值成员可以是Elements - 过滤子句的集合,也可以是查询文本。作为过滤器管理器类可以/应该的一部分,GetFilterText方法将它们连接在一起:

    For n As Int32 = 0 To filters.Count - 1
        Console.WriteLine("Name: {0}   Count: {1}{2}Text:{3}", filters(n).Name,
                            filters(n).Elements.Count,
                            Environment.NewLine, filters(n).FilterText)
    Next

结果:

  

名称:默认计数:1
  文字:Id = 7
  名称:蓝色数:1   文字:颜色=蓝色
  名称:复数:6
  文字:[名称]如%Bob%或[名称]如%Alice%AND Color =&#39; Blue&#39; AND Active = True AND AccessRequired&lt; 3 AND DateAdded&gt; #2/11/2010#AND CreatedBy =&#39; ziggy&#39;

如果您使用&#34; Elements&#34;作为ValueMember,您将获得该系列。

enter image description here enter image description here

组合显示用户的Name。在右侧,标签显示ValueMember在这种情况下,它是FilterText或加入Elements。正如我所说,你可以取代SelectedValue代替实际的集合,但这可以作为SelectedItem的一部分提供。

如果savable意味着超出应用程序实例的生命周期,那就是另一个问题,但这些问题非常容易序列化。