VB.net自动完成Textbox过滤器使用mysql数据库作为自定义源

时间:2017-07-17 07:33:02

标签: mysql vb.net autocomplete

我遇到有关自动填充文本框的问题。首先,我已经将自动完成文本框与mysql数据库一起用作自定义源,但是自动完成的默认文本过滤器是“开头”而不是“包含”。我想将textfilter更改为“contains”,这样当我搜索字符串的任何部分时,包含搜索词的整个名称将出现在自动填充建议中。

任何人都可以帮我修复我的代码吗?

这是我到目前为止所做的代码:

            txtSearch.AutoCompleteMode = AutoCompleteMode.SuggestAppend
            txtSearch.AutoCompleteSource = AutoCompleteSource.CustomSource
            Dim DataCollection As New AutoCompleteStringCollection()
            Dim query As String
            sqlcon = New MySqlConnection
            sqlcon.ConnectionString =
        "server=localhost;userid=root;password=root;database=svfmemberlistdb"

            Try
                sqlcon.Open()
                query = " SELECT Name FROM svfmemberlistdb.svfmemberlist "
                sqlcmd = New MySqlCommand(query, sqlcon)
                sqladr.SelectCommand = sqlcmd
                sqladr.Fill(ds)
                sqladr.Dispose()
                sqlcon.Close()
                For Each row As DataRow In ds.Tables(0).Rows
                    If row.ToString.Contains(txtSearch.Text) Then
                        DataCollection.Add(row(0).ToString())
                    End If
                Next
            Catch ex As Exception

            End Try
            txtSearch.AutoCompleteCustomSource = DataCollection

1 个答案:

答案 0 :(得分:0)

我引用Mitja Bonca在MSDN上的答案。

  

在这种情况下,autocompletemode将不会这样做。它的代码并不意味着   喜欢这样的东西。

     

您必须自己编写代码才能对每个字母进行过滤   按

     

所以我建议不要使用autocompletemode,并获取所有数据   (名称)到dataTable。当用户按下某个按钮时(“1”代表   例如,您可以通过创建新的数据表来开始过滤   (保留主要部分 - 这样您就可以返回所有数据了   通过backspace清除comboBox),使用Copy()方法 - 创建一个完整的   原始副本的副本,并使用Select方法进行过滤。

     

这应该看起来像是在两侧使用%simbol   string - 过滤中间 - 这就是你想要的!

DataTable AllNames = new DataTable();
//fill it up and leave it untouched!

//to filter comboBox with names that contains pressed characters do in 
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    string name = string.Format("{0}{1}", comboBox1.Text, e.KeyChar.ToString()); //join previous text and new pressed char
    DataRow[] rows = table.Select(string.Format("FieldName LIKE '%{0}%'", name));
   DataTable filteredTable = AllNames.Clone();
   foreach(DataRow r in rows)
       filteredTable.ImportRow(r);
   comboBox1.DataSource = null;
   comboBox1.DataSource = filteredTable.DefaultView;
   comboBox1.DisplayMember = "FieldName";
}

Reference

编辑:这当然是c#答案而不是VB.NET但是获得这个概念可能会有所帮助。