我的项目是在Visual Basic中。我正在尝试创建一个自定义&可爱的"过滤器"对于使用多个TextBox的DataGridView。现在,添加到组合框的任何List(Of String)在框中显示为(Collection)。我希望我的用户能够选择他们创建的用户,因此我希望列表具有可在组合框中选择的显示名称。这是一些代码。
System.setProperty("webdriver.chrome.driver", "/Users/xyz/abc/chromedriver_mac_2.20");
是否可以为List添加显示名称?
答案 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
初始化(如果需要,可以省略添加的项目)
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
您需要添加Remove
和Count
等方法和属性,但这应该足以证明。我不确定SortedList
,Dictionary
使用字段名称可能会更好,但控制顺序的东西似乎值得。我也不确定我会公开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,您将获得该系列。
组合显示用户的Name
。在右侧,标签显示ValueMember
在这种情况下,它是FilterText
或加入Elements
。正如我所说,你可以取代SelectedValue
代替实际的集合,但这可以作为SelectedItem
的一部分提供。
如果savable
意味着超出应用程序实例的生命周期,那就是另一个问题,但这些问题非常容易序列化。