首页 > 解决方案 > 是否可以有一个自动填充组合框(在 datagridview 中),它还提供列中所有数据库项的下拉列表?

问题描述

所以我有一个DataGrid使用来自MySQL数据库的数据。我试图做到这一点,以便当用户开始在“项目”列中输入时,该框将自动填充/建议/附加,并允许数据库列中所有元素的下拉列表。

到目前为止,我已经设法提供自动填充功能下拉列表我似乎无法让他们两个一起工作。我开始怀疑这是否可能,但我还没有找到解决方案。

于是,我发了这篇文章。如果有人有任何有用的建议。以下是我用来执行自动填充和下拉列表的一些功能。

     private void invoice_DG_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        string titleText = invoice_DG.Columns[1].HeaderText;
        if (titleText.Equals("ITEM"))
        {
            ComboBox autoText = e.Control as ComboBox;
            /*if (autoText != null)
            {              
                autoText.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                autoText.AutoCompleteSource = AutoCompleteSource.CustomSource;
                //AutoCompleteStringCollection DataCollection = new AutoCompleteStringCollection();
                autoText.AutoCompleteCustomSource = get_From_Database();
                //autoText.Items.Add(get_From_Database());                    
            }*/

            if (e.Control is DataGridViewComboBoxEditingControl)
            {
                autoText.DropDownStyle = ComboBoxStyle.DropDown;
                autoText.AutoCompleteSource = AutoCompleteSource.CustomSource;
                autoText.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
                autoText.AutoCompleteCustomSource = get_From_Database();
            }
        }
    }

    private AutoCompleteStringCollection get_From_Database()
    {
        AutoCompleteStringCollection Coll = new AutoCompleteStringCollection();

        string querySelect = "SELECT * FROM Items";
        MySqlCommand commandSelect = new MySqlCommand(querySelect, conn);
        MySqlDataReader reader = commandSelect.ExecuteReader();
        while (reader.Read())
        {
            string type = reader.ToString();
            Coll.Add(type); //data inserted in collection so that it will be autocomplete when you type keywords
            if (list_Loaded == false)
            {
                string item = reader.GetString("name");
                ITEM.Items.Add(item);
            }
        }            reader.Close();
        list_Loaded = true;


        return Coll;
    }

注意这些功能正在发生变化,可能无法反映最终将被接受的内容。这只是他们目前的状态

标签: c#datagridviewcomboboxautofill

解决方案


我正在努力做到这一点,以便当用户开始在“项目”列中输入时,该框将自动填充/建议/附加,并允许数据库列中所有元素的下拉列表。

到目前为止,我要么设法提供自动填充功能,要么提供下拉列表。我似乎无法让他们两个一起工作

这里重要的是您希望用户能够附加. 因此,下拉控件不能下拉列表,因为这将阻止用户输入列表中尚不存在的内容。我建议您将其更改为常规 的下拉控件。

典型的流程是您:

  1. 在第一次按键后显示下拉控件,并开始使用根据用户键入的内容过滤的值(是否来自数据库是偶然的)填充下拉列表。如果没有匹配项,则这是新条目的开始,因此输入的字符将成为列表中的新条目

  2. 随着输入的字符越来越多,继续过滤或将字符附加到新条目(来自 #1)

  3. 当他们按Enter/focus 离开时,选择匹配的过滤记录,或者如果它是一个新条目,则适当保存(在本例中为数据库)

您可以在 Visual Studio 中很容易地看到这种模式,打开一个 C# 文件并观察 Intellisense 的自动完成方面如何与 C# 的dynamic关键字一起工作。通常,如果无法识别该方法,C# 自动完成类型会阻止您自动完成方法调用。

dynamic自动完成的不同之处在于它不做任何假设,并且默认情况下不提供潜在成员。但是,它确实有添加的概念。

dynamic something = // get a reference to some object
something.Foo ();   // Intellisense won't offer the Foo() suggestion.  
                    // It won't result as a compile error either

但是,如果我们在相同的方法范围内再次尝试相同的方法调用,Intellisense 会介入并显示我们之前调用的方法Foo()(至少在编码时)是可用的。当然,直到运行时我们才能确定。

something.Foo();  // Foo() NOT available in auto-complete
something.Foo();  // Foo() now available in auto-complete

推荐阅读