DataGridView ComboBox - разрешить введенное значение ИЛИ автозаполнение

Я разрабатываю приложение WinForms на С#/VS2010. В двух местах у меня есть требование привязать ComboBox к элементам строки таблицы данных (давайте назовем таблицу «updateTable»). Пользователи могут вводить здесь любой текст. Однако, чтобы помочь пользователям, список ComboBox заполняется из другой таблицы (давайте назовем ее «lookupTable») со значениями SuggestAppend, которые могут использоваться.

У меня это отлично работает в отдельном поле со списком, установив следующие значения через конструктор форм:

  • Привязки данных = имя поля updateTable
  • Источник данных = lookupTableBindingSource
  • DisplayMember = имя поля таблицы поиска
  • ValueMember =
  • AutocompleteMode = SuggestAppend
  • AutoCompleteSource = СписокЭлементов
  • AutoCompleteCustomSource = (Коллекция)
  • ВыбранныйЭлемент = (нет)
  • SelectedValue = (нет)

Мне также нужно добиться этого аналогичным образом в ComboBox в DataGridView, и я не могу заставить это работать. Что я пробовал:

Настройка этих свойств через конструктор форм:

  • DataPropertyName = имя поля updateTable
  • Источник данных = lookupTableBindingSource
  • DisplayMember = имя поля таблицы поиска
  • Предметы (коллекция)
  • ValueMember = (нет)

Через код я также добавляю:

    private void identitiesDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is DataGridViewComboBoxEditingControl)
        {
            ComboBox combo = (ComboBox)e.Control;
            ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
            ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
            ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
            combo.Validated -= new EventHandler(combo_Validated);
        }
    }

    void combo_Validated(object sender, EventArgs e)
    {
        Object selectedItem = ((ComboBox)sender).SelectedItem;
        DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)identitiesDataGridView.Columns[identitiesDataGridView.CurrentCell.ColumnIndex];
        if (!String.IsNullOrEmpty(col.ValueMember))
            identitiesDataGridView.CurrentCell.Value = GetPropValue(selectedItem, col.ValueMember);
        else
            identitiesDataGridView.CurrentCell.Value = selectedItem;
    }

    public static object GetPropValue(object src, string propName)
    {
       if (src == null)
           return null;
       return src.GetType().GetProperty(propName).GetValue(src, null);
    }

    private void identitiesDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (identitiesDataGridView.IsCurrentCellDirty)
        {
            identitiesDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

Это а) выдает мне ошибки при запуске формы, потому что некоторые значения updateTable не найдены в lookupTable и б) не позволяет мне выбирать что-либо, кроме значений lookupTable, при редактировании.

Любая идея, как я могу добиться этого эффекта «введите то, что вам нравится, но вот несколько предложений» в сетке данных?


person ifinlay    schedule 22.01.2014    source источник