C#发布ComboBox和来自数据库的建议

时间:2018-08-21 11:47:51

标签: c# visual-studio combobox autocomplete autosuggest

我正在将Winform与comboBox一起使用,并将其设置为AutoCompleteMode =建议 和AutoCompleteSource =列表。

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

要插入,我想对用户Input运行查询。 f.E.用户键入“ S”->,则查询应仅返回值“ ... WHERE x LIKE 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;
            }
        }
    }

现在,让我的表单变得奇怪: 当我运行应用程序并转到我的comboBox时, 我将从在其中键入“ S”开始。

但是,然后,comboBox.Text将被附加到数据库中的第一个匹配项中,该匹配项不是以“ S”开头,而是以“ A”开头(就像我对LIKE语句没有任何字符串那样进行查询。 / p>

但是,为什么comboBox会显示此值,而不仅仅是显示下拉列表?

如果我删除ComboBox中的每个角色并再次尝试,一切将按预期工作。 这只是创建表单后的第一个行为。

[编辑] 谢谢@dafie:

谢谢,我已经对此进行了更改(这也是我之前的尝试之一)-但是,控件的行为也很奇怪。

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

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

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

3 个答案:

答案 0 :(得分:1)

我认为,我找到了一个似乎可以按预期工作的解决方案:)

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;

不幸的是,这有点丑陋,直接在后面使用了两个foreach循环,但是在我的最新测试中效果很好。

我现在将在我的其他项目中尝试它,如果它将获得预期的结果,我会将问题标记为已解决。

感谢您的帮助:)

答案 1 :(得分:0)

我认为您在cb_city.Text填充文本之前触发此方法。您应该将cb_city.Text != null更改为!String.IsNullOrEmpty(cb_city.Text),因为当cb_city.Text设置为""时,您的代码可以检查条件。

答案 2 :(得分:0)

由于要设置数据源,因此正在更改组合框项目。

数据源不是自动完成所使用的。

相反,您应该使用AutoCompleteCustomSource。

EX:

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;
            }