C#自动完成

C#自动完成

我正在尝试向文本框添加自动完成功能,结果来自数据库。它们的格式为

[001]最后,第一中间

目前,您必须输入[001] ...才能显示要显示的条目。所以问题是我希望它完成,即使我先键入firstname。所以,如果一个条目是

[001] Smith,John D.

如果我开始输入John,则此条目应显示在自动完成的结果中。

目前代码看起来像

AutoCompleteStringCollection acsc = new AutoCompleteStringCollection();txtBox1.AutoCompleteCustomSource = acsc;txtBox1.AutoCompleteMode = AutoCompleteMode.Suggest; txtBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; ....if (results.Rows.Count > 0)
    for (int i = 0; i < results.Rows.Count && i < 10; i++) 
    {
        row = results.Rows[i];
        acsc.Add(row["Details"].ToString());
    }}

results是包含查询结果的数据集

查询是使用like语句的简单搜索查询。如果我们不使用自动完成并将结果抛入数组,则会返回正确的结果。

有什么建议?

编辑:

这是返回结果的查询

SELECT Name from view_customers where Details LIKE '{0}'

{0}是搜索字符串的占位符。


侃侃尔雅
浏览 497回答 3
3回答

潇潇雨雨

现有的自动完成功能仅支持按前缀搜索。似乎没有任何体面的方式来覆盖行为。有些人通过覆盖OnTextChanged事件来实现自己的自动完成功能。这可能是你最好的选择。例如,您可以在其ListBox下方添加一个TextBox,并将其默认可见性设置为false。然后您可以使用OnTextChanged事件TextBox和SelectedIndexChanged事件ListBox来显示和选择项目。这似乎是一个很好的例子:public&nbsp;Form1(){ &nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent(); &nbsp;&nbsp;&nbsp;&nbsp;acsc&nbsp;=&nbsp;new&nbsp;AutoCompleteStringCollection(); &nbsp;&nbsp;&nbsp;&nbsp;textBox1.AutoCompleteCustomSource&nbsp;=&nbsp;acsc; &nbsp;&nbsp;&nbsp;&nbsp;textBox1.AutoCompleteMode&nbsp;=&nbsp;AutoCompleteMode.None; &nbsp;&nbsp;&nbsp;&nbsp;textBox1.AutoCompleteSource&nbsp;=&nbsp;AutoCompleteSource.CustomSource;}private&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;acsc.Add("[001]&nbsp;some&nbsp;kind&nbsp;of&nbsp;item"); &nbsp;&nbsp;&nbsp;&nbsp;acsc.Add("[002]&nbsp;some&nbsp;other&nbsp;item"); &nbsp;&nbsp;&nbsp;&nbsp;acsc.Add("[003]&nbsp;an&nbsp;orange"); &nbsp;&nbsp;&nbsp;&nbsp;acsc.Add("[004]&nbsp;i&nbsp;like&nbsp;pickles");}void&nbsp;textBox1_TextChanged(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;listBox1.Items.Clear(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(textBox1.Text.Length&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;hideResults(); &nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(String&nbsp;s&nbsp;in&nbsp;textBox1.AutoCompleteCustomSource) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.Contains(textBox1.Text)) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Found&nbsp;text&nbsp;in:&nbsp;"&nbsp;+&nbsp;s); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listBox1.Items.Add(s); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listBox1.Visible&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}void&nbsp;listBox1_SelectedIndexChanged(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;textBox1.Text&nbsp;=&nbsp;listBox1.Items[listBox1.SelectedIndex].ToString(); &nbsp;&nbsp;&nbsp;&nbsp;hideResults();}void&nbsp;listBox1_LostFocus(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;hideResults();}void&nbsp;hideResults(){ &nbsp;&nbsp;&nbsp;&nbsp;listBox1.Visible&nbsp;=&nbsp;false;}如果没有太多努力,您可以做更多的事情:将文本附加到文本框,捕获其他键盘命令,等等。

波斯汪

如果您决定使用基于用户输入的查询,请确保使用SqlParameters来避免SQL注入攻击SqlCommand&nbsp;sqlCommand&nbsp;=&nbsp;new&nbsp;SqlCommand();sqlCommand.CommandText&nbsp;=&nbsp;"SELECT&nbsp;Name&nbsp;from&nbsp;view_customers&nbsp;where&nbsp;Details&nbsp;LIKE&nbsp;'%"&nbsp;+&nbsp;@SearchParam&nbsp;+&nbsp;"%'";sqlCommand.Parameters.AddWithValue("@SearchParam",&nbsp;searchParam);
打开App,查看更多内容
随时随地看视频慕课网APP