Возможно ли иметь комбинированный список автозаполнения (в рамках таблицы данных), который также предоставляет раскрывающийся список всех элементов базы данных в столбце? - PullRequest
1 голос
/ 27 марта 2019

Итак, у меня есть 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;
    }

ПРИМЕЧАНИЕ Эти функции изменяют и могут не отражать то, что в конечном итогебыть принятым.Это просто их текущее состояние .

1 Ответ

0 голосов
/ 27 марта 2019

Я пытаюсь сделать так, чтобы, когда пользователь начал печатать в столбце «Предметы», поле автоматически заполняло / предлагать / append , а также позволяло выпадающий список всех элементов в столбец базы данных.

Пока что мне удалось предоставить функцию автозаполнения ИЛИ раскрывающийся список. Кажется, я не могу заставить их обоих работать вместе

Здесь важно то, что вы хотите, чтобы у пользователя была возможность добавить . Для этого раскрывающийся элемент управления должен , а не быть раскрывающимся списком , поскольку это не позволит пользователям вводить то, чего еще нет в списке. Я предлагаю вам изменить его на обычный выпадающий элемент управления.

Типичный поток таков:

  1. отобразить раскрывающийся элемент управления после первого нажатия клавиши и начать заполнять раскрывающийся список значениями (независимо от того, поступает ли это из БД случайно), отфильтрованными по тому, что набрал пользователь. Если совпадений нет, то это начало новой записи, поэтому введенный символ становится новой записью в списке

  2. По мере того, как вводится все больше и больше символов, продолжайте фильтровать ИЛИ добавляйте символы к новой записи (с # 1)

  3. Когда они нажимают , введите / фокус, выберите соответствующую отфильтрованную запись ИЛИ, если это была новая запись, сохраните соответствующим образом (в данном случае в БД)

Вы можете очень легко увидеть этот тип шаблона в Visual Studio с открытым файлом C # и наблюдением, как аспект автозаполнения Intellisense работает с ключевым словом dynamic в C #. Обычно вид автозаполнения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...