【问题标题】:C# issues ComboBox and Suggestions from DatabaseC# 问题 ComboBox 和来自数据库的建议
【发布时间】:2019-01-27 14:27:59
【问题描述】:

我正在使用带有组合框的 Winform,组合框设置为 AutoCompleteMode = 建议 和 AutoCompleteSource = 列表。

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

Insted,我想针对用户输入运行查询。 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;
            }
        }
    }

现在,对于我的表单的奇怪行为: 当我运行应用程序并转到我的组合框时, 我从在其中输入“S”开始。

但是,comboBox.Text 将被附加到我的数据库中的第一个匹配项,该匹配项不是以“S”开头,而是以“A”开头(就像我已经为 LIKE 语句完成了没有任何字符串的查询。

而且,为什么组合框会显示这个值,而不是只显示下拉菜单?

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

[编辑] 谢谢@dafie:

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

当我输入第一个字母时,没有任何反应(它不会显示带有建议的列表)。 然后当我输入第二个字母时,它会删除我输入的第一个字符,只有第二个是可见的,并且组合框将附加带有“S”的搜索的第一个建议。

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

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

【问题讨论】:

  • 顺便说一句:我已经为上面的代码尝试过 keyDown 和 keyPress 事件。
  • 你用什么事件来触发你的代码?
  • 我已经为 cb_city 尝试了 KeyDown 和 KeyPress 事件: private void cb_City_KeyDown(object sender, KeyEventArgs e) { }

标签: c# visual-studio combobox autocomplete autosuggest


【解决方案1】:

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

【讨论】:

  • 嗨,达菲,谢谢。但这并没有按预期工作。我已根据您的建议结果在下面编辑了我的问题。
【解决方案2】:

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

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

您应该使用 AutoCompleteCustomSource。

前:

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

【讨论】:

  • 此外,您还需要处理不同案例的问题。例如:“A”与“a”
  • 您好,感谢您的建议。据我所知,您正在列表 AutoData 中搜索每个带有“a”的项目。正确的?但老实说,在用户输入他的第一个字符之前,我不知道我需要搜索哪些数据。我现在也使用了 TextUpdate 事件,但是随后,每个字符串都将覆盖前一个字符串 - 而且我没有从表单中看到任何关于我的输入的建议:-( 如果我在不尝试的情况下使用它,DataSource 工作得很好使用用户输入减少数据。
  • 如果我在表格显示之前填写数据源,一切正常。只是时间,表单需要加载所有数据太长,因为数据库包含近20,000个城市名称...... :-(
  • 这是从列表 (a) 中查找以在组合框 (combobox1.Text) 中键入的任何内容开头的项目。
  • 好的,我将在今天晚些时候在另一个项目中再次尝试(没有任何其他代码)。现在,它似乎没有像我预期的那样工作......
【解决方案3】:

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

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 循环,但在我最近的测试中效果很好。

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

感谢您的所有帮助:)

【讨论】:

  • 在我的原始项目中实施后,一切都按预期工作。这似乎是我的开场问题的解决方案:)
猜你喜欢
  • 2016-05-03
  • 2011-07-14
  • 2011-10-10
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多