Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 组合框项目-显示列表的成员(字符串)?_Vb.net_List_Combobox - Fatal编程技术网

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

Vb.net 组合框项目-显示列表的成员(字符串)?,vb.net,list,combobox,Vb.net,List,Combobox,我的项目是用Visual Basic编写的。我正在尝试使用几个文本框为DataGridView创建一个自定义的可保存的“过滤器”。现在,添加到组合框中的任何列表(字符串)在框中显示为(集合)。我希望我的用户能够选择他们创建的一个,因此我希望列表有一个显示名称,可以在组合框中选择。下面是一些代码 Dim savedFilter As New List(Of String) savedFilter.Add(NameTextBox.Text) savedFilter.Add(AgeTextBox.Te

我的项目是用Visual Basic编写的。我正在尝试使用几个文本框为DataGridView创建一个自定义的可保存的“过滤器”。现在,添加到组合框中的任何列表(字符串)在框中显示为(集合)。我希望我的用户能够选择他们创建的一个,因此我希望列表有一个显示名称,可以在组合框中选择。下面是一些代码

Dim savedFilter As New List(Of String)
savedFilter.Add(NameTextBox.Text)
savedFilter.Add(AgeTextBox.Text)
savedFilter.Add(NotesTextBox.Text)
ComboBoxSavedFilters.Items.Add(savedFilter)

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

您可以在“我的设置”下设置StringCollection

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

组合框中的设置项

ComboBox1.Items.AddRange(My.Settings.Filters.Cast(Of String).ToArray)
添加项目

My.Settings.Filters.Add(Now.ToShortDateString)
您也可以删除和清除项目。

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

显然,与其说是过滤器的集合,不如说是一个过滤器的条件或子句的集合:


我浓缩了问题中的代码,但是有14个字段可以过滤,并且有多个过滤器可以应用于一个字段。

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

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
,使用字段名的
字典可能更好,但控制顺序似乎是值得的。我也不确定我是否会公开
元素
集合-管理它可能更好地留给类

希望显示一组这些元素(与过滤器元素/子句相反)的组合是目标

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"
结果:

名称:默认计数:1
文本:Id=7
名称:蓝色计数:1
文本:颜色=蓝色
名称:复杂计数:6
Text:[Name]如%Bob%或[Name]如%Alice%和Color='Blue'和Active=True,AccessRequired<3和DateAdded>#2010年11月2日#和CreatedBy='ziggy'

如果您使用“元素”作为ValueMember,您将获得该集合

组合框显示用户的
名称
。在右侧,一个标签显示
ValueMember
。在本例中,它是
FilterText
或连接的
元素。正如我所说的,您可以取回实际的集合作为
SelectedValue
,但这是
SelectedItem
的一部分


如果
savable
意味着超出了应用程序实例的生命周期,这是另一个问题,但它们很容易序列化。

或者如果您懒惰,请使用内置的泛型类
元组

创建
元组(字符串的集合,列表(字符串的))的集合
,并使用@puropoix建议的方法将集合绑定到
组合框

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))

问题是我只想为整个列表指定一个显示字符串。当我只想为整个列表添加一个值时,我觉得这样做会在组合框中为每个字段添加一个值。@Mattlerich,只需将第二个属性的类型更改为
list(of String)
,第一个属性将包含筛选器集合的显示名称,第二个属性也包含集合本身即可展开,我希望用户能够在组合框中为过滤器列表键入他们想要的名称,然后按enter键保存它,因为我有一个“保存”按钮,可以将保存的过滤器添加到列表中,出于某种原因,即使我可以看到其数据源显示所有过滤器,组合框也只会显示第一个值。有什么问题吗?我浓缩了问题中的代码,但是有14个字段可以过滤,并且有多个过滤器可以应用于一个字段。过滤是在SQL中完成的,因此,如果您选择在“Name”上执行两个文件管理器,即在一个文本框中输入“Bob”,在下面的文本框中输入“Alice”,则SQL查询将是“…其中[Name]类似于%Bob%或[Name]类似于%Alice%”。这些自定义过滤器需要保存,每个文本框值(包括“”)都保存在一个列表(字符串)中,然后放入一个组合框中,但我需要一个名称附加到该列表,而不是(集合)此外,组合框不需要执行过滤-这已经通过使用文本框中的文本更改事件完成,因此DataGridView过滤器在您更改文本框中的值时有效。我提供的内容没有什么做不到的。过滤器可以是简单的,也可以是复杂的。它提供的功能元素是为它们指定一个名称。Text_Changed不适合应用filter它实际上是一个名为concat()的方法,该方法使用SQL进行筛选Gi按照您所说的做了,并且组合框填充了列表中的每个字段,而不仅仅是一个值来表示整个列表。我做错了什么?
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
Dim filter As List(Of String) =
    DirectCast(Me.ComboBoxSavedFilters.SelectedValue, List(Of String))