Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
C#问题组合框和来自数据库的建议_C#_Visual Studio_Combobox_Autocomplete_Autosuggest - Fatal编程技术网

C#问题组合框和来自数据库的建议

C#问题组合框和来自数据库的建议,c#,visual-studio,combobox,autocomplete,autosuggest,C#,Visual Studio,Combobox,Autocomplete,Autosuggest,我正在使用带有组合框的Winform,该组合框设置为AutoCompleteMode=suggest 和AutoCompleteSource=List 自动完成的值存储在SQLite数据库中。 由于该表中有大量数据,因此在创建表单时加载所有值是没有意义的 相反,我想对用户输入运行查询。 f、 E.用户键入“S”->则查询应仅返回值“…其中x类似S%” 这很好用——有一个奇怪的行为,我还没弄明白 为了防止在没有空字符串的情况下触发SQL查询,我使用以下代码: private void cb

我正在使用带有组合框的Winform,该组合框设置为AutoCompleteMode=suggest 和AutoCompleteSource=List

自动完成的值存储在SQLite数据库中。 由于该表中有大量数据,因此在创建表单时加载所有值是没有意义的

相反,我想对用户输入运行查询。 f、 E.用户键入“S”->则查询应仅返回值“…其中x类似
S%

这很好用——有一个奇怪的行为,我还没弄明白

为了防止在没有空字符串的情况下触发SQL查询,我使用以下代码:

    private void cb_City_KeyDown(object sender, KeyEventArgs e)
    {
        if (Globals.UseAutoFillOnCities == true)
        {
            if (!string.IsNullOrEmpty(cb_city.Text))
            {
                foreach (DataRow AutoFillItems in dbAction.GetAutoComplete("CITIES", cb_city.Text).Rows)
                {
                    AutoFillCities.Add(AutoFillItems[0].ToString());

                }
                cb_city.DataSource = AutoFillCities;
            }
        }
    }
现在,让我来看看我身体的奇怪行为: 当我运行应用程序并转到我的组合框时, 我从在里面输入“S”开始

但是,comboBox.Text将被数据库中的第一个匹配项所追加,该匹配项不是以“S”开头,而是以“A”(就像我在查询时没有使用like语句的任何字符串一样)

但是,为什么组合框会显示这个值,而不仅仅是显示下拉列表

如果我删除组合框中的每个字符,然后再试一次,一切都会正常工作。 这只是创建表单后的第一个行为

[编辑] 谢谢@dafie:

谢谢,我已经改变了这一点(这也是我之前的一次尝试)-但是,控件的行为也很奇怪

当我输入第一个字母时,什么也没有发生(它不会显示包含建议的列表)。 然后,当我键入第二个字母时,它将删除我键入的第一个字符,只有第二个字符可见,组合框将用“S”附加搜索的第一个建议

例如,我想输入“St”,然后在组合框中输入t“Saal”。 (Saal是带有“S”的搜索的第一个结果)

问题是:如果我只将AutoComplete方法设置为“建议”,为什么组合框会附加文本?
为什么要删除我的第一个输入?

我想你在
cb\u city.Text
被文本填充之前就启动了这个方法。你应该将
cb\u city.Text!=null
更改为
!String.IsNullOrEmpty(cb\u city.Text)
,因为当
cb\u city.Text
设置为
时,你的代码可以检查条件“

它正在更改您的组合框项,因为您正在设置数据源

数据源不是用于自动完成的

相反,您应该使用AutoCompleteCustomSource

例:

List AutoData=新列表{“Anthony”、“Aaron”、“Adam”、“Ben”、“Brian”、“Charles”、“Chuck”、“Dan”};
私有void comboBox1_TextUpdate(对象发送方,事件参数e)
{
var items=AutoData.Where(a=>a.StartsWith(comboBox1.Text));
comboBox1.AutoCompleteCustomSource.Clear();
comboBox1.AutoCompleteCustomSource.AddRange(items.ToArray());
comboBox1.AutoCompleteSource=AutoCompleteSource.CustomSource;
}

我想,我找到了一个解决方案,它似乎如我所期望的那样有效:)

不幸的是,它有点难看,直接在后面使用两个foreach循环,但在我最近的测试中,这很有效

我现在将在我的另一个项目中尝试它,如果它将产生预期的结果,我将把这个问题标记为已解决


谢谢你的帮助:)

顺便说一句:我已经为上面的代码尝试了keyDown和keyPress事件。你用什么事件触发你的代码?我已经为cb_city尝试了keyDown和keyPress事件:private void cb_city_keyDown(对象发送者,KeyEventArgs e){}你好,谢谢。但这并没有像预期的那样奏效。我已经把我的问题和你建议的结果放在下面。另外,你需要处理不同情况下的问题。嗨,谢谢你的建议。据我所知,您正在搜索列表中带有“a”的每个项目。对吗?但老实说,在用户输入第一个字符之前,我不知道需要搜索哪些数据。我现在也使用了TextUpdate事件,但之后,每个字符串都将覆盖上一个字符串-我看不到表单对我输入的任何建议:-(如果我在使用数据源时不尝试使用user-intput来减少数据,则数据源工作正常。如果我在显示表单之前填充数据源,则一切都会顺利进行。只是表单需要加载所有数据的时间过长,因为数据库包含近20000个城市名称…:-(这是从列表(a)中查找以combobox(combobox1.Text)中键入的内容开头的项目。好的,我将在另一个项目中重试(无任何其他代码)今天晚些时候。现在,它似乎没有像我预期的那样工作……在我的原始项目中实现了这一点之后,一切都如预期的那样工作。这似乎是我的第一个问题的解决方案:)
List<string> AutoData = new List<string>{ "Anthony", "Aaron", "Adam", "Ben", "Brian", "Charles", "Chuck", "Dan"};

private void comboBox1_TextUpdate(object sender, EventArgs e)
            {
                var items = AutoData.Where(a => a.StartsWith(comboBox1.Text));
                comboBox1.AutoCompleteCustomSource.Clear();
                comboBox1.AutoCompleteCustomSource.AddRange(items.ToArray());
                comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
            }
private void Form1_Load(object sender, EventArgs e)
    {
        foreach (DataRow AutoFillItems in GetAutoComplete("CITIES", comboBox1.Text).Rows)
        {
            AutoFillCities.Add(AutoFillItems[0].ToString());
        }

        foreach (string item in AutoFillCities)
        {
            comboBox1.AutoCompleteCustomSource.Add(item);
        }

        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;