如何在C#中为文本字段获取动态生成的下拉选项?

时间:2012-01-20 06:22:21

标签: c# database winforms drop-down-menu

我想在C#winform应用程序中有一个文本字段,我想要的效果是,当用户在文本字段中键入内容时,程序在后台搜索数据库,然后生成下拉列表用户可以选择..

以下是两个基于Web的示例,但请注意我的应用程序是基于winforms而不是基于Web的。我只是想要相同的效果,这就是为什么我要展示这些:

cinemasquid.com:

cinemasquid.com:

blu-ray.com:

blu-ray.com:

如何在C#winform应用程序中为文本字段获得相同的效果?

3 个答案:

答案 0 :(得分:3)

首先,您需要在表单上绑定TextChanged事件。然后,当用户按任意键时,您将获得该事件。现在,在事件处理程序内部检索用户输入的字符串,使用此字符串执行搜索(不要在UI线程上进行搜索,否则您的UI将挂起,您可以在BackgroudWorker中进行搜索({{ 3}}))。获得结果后,将此结果绑定到ListBox

我开发了一个具有自动完成功能的应用程序。在此if用户输入任何电影名称时,匹配结果将用于显示在列表框中。

enter image description here

希望这适合你。

答案 1 :(得分:1)

如果您不想对解决方案进行编码,可以通过Google搜索获得一些自定义控件,例如:http://www.dotnetfunda.com/articles/article225.aspx

但是你应该记住响应时间:如果你每次用户在文本框中输入一个字母时编码数据库搜索,你的应用程序就会变得迟钝和/或反应迟钝,这取决于桌子上的记录数量,你的速度。网络连接和许多其他因素。

考虑在内存中预加载字符串集合(名称,标题,无论您希望在文本框中显示的内容),然后对内存中的集合执行LINQ查询以填充控件的自动完成部分。

答案 2 :(得分:0)

正如Amar Palsapure所说,您需要使用{Droptonown的TextChanged事件。此外,欢迎背景工作者。 这是一个简短的例子:

首先,我们需要一些数据源。在这种情况下,这将是一个简单的字符串列表:

List<string> DataSource = new List<string>
{
   " How do I use jQuery to select all children except a select element",
    "How can I get the text of the selected item from a dropdown using jQuery?",
    "Dropdown menu in IE6 inserting too much width, not dropping-down",
    "How to display images within a drop down box instead of text",
    "InfoPath 2007 - Populate drop-down list on-the-fly",
    "Is there any difference between drop down box and combo box?",
    "Drop Down list null value not working for selected text c#?",
    "Make drop-downs automatically drop in a loop cycle",
    "PHP How can I keep the selected option from a drop down to stay selected on submit?",
    "Jquery Issue - Drop down list does NOT show from iPhone/Mobile Devices"
};

接下来,BackgroundWorker DoWork事件 - 这是在我们的数据源中搜索有效位置的部分响应:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        String text = e.Argument as String;
        List<String> results = new List<string>();

        //Code for seraching text - may be diffrent if you have another DataSource 
        foreach (String dataString in DataSource)
        {
            if (dataString.IndexOf(text, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
            {
                results.Add(dataString);
            }
        }
        e.Result = results;
    }

你可以看到,结果是e.Result返回的,所以我们也需要实现RunWorkerCompleted事件:

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        comboBox1.Items.AddRange((e.Result as List<String>).ToArray());
        comboBox1.DroppedDown = true;
    }

此代码将填充我们的dropDown女巫返回值,并将其显示给用户。

当然,为了实现此功能,您需要在RunWorkerAsync中致电TextChanged

    private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        // Save position of cursor, because it like to dissapering.
        int cursor = comboBox1.SelectionStart;
        //Clearing items in dropDown 
        comboBox1.Items.Clear();

        //Is something was searched before, cancel it!
        while (backgroundWorker1.IsBusy)
        {
            if (!backgroundWorker1.CancellationPending)
            {
                backgroundWorker1.CancelAsync();
            }
        }

        // And search new one 
        backgroundWorker1.RunWorkerAsync(comboBox1.Text);

        // And bring back cursor to live
        comboBox1.SelectionStart = cursor;
    }

我希望能帮到你