我遇到有关自动填充文本框的问题。首先,我已经将自动完成文本框与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
答案 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";
}
编辑:这当然是c#
答案而不是VB.NET
但是获得这个概念可能会有所帮助。