Winforms, Combobox, Databinding ... позволяют пользователю вводить значение, не найденное в DataSource - PullRequest
2 голосов
/ 17 марта 2011

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

Если я просто включаю привязку данных и устанавливаю тип выпадающего меню на что угодно, кроме DropDownList, это позволяет мне вводить все, что я хочу, но не сохраняет это для объектов ... Похоже, простую проблему, чтобы решить ... помочь?

1 Ответ

2 голосов
/ 17 марта 2011

Я добавил обработчик событий в ComboBox.Leave , этот код будет добавлять вновь введенную строку в комбинированном списке в базовый список (страны), а также обновлять привязку комбинированного списка к нему.

Ограничения

  1. Вам придется обработать добавление нового элемента в зависимости от типа источника данных, который у вас есть.
  2. List.Contains чувствителен к регистру, вы можете хранить все строки в одном регистре. И преобразуйте введенное пользователем значение в этот случай, прежде чем принять решение о добавлении его в источник данных.

Итак, измените обработчик событий comboBox1_Leave в соответствии с вашими типами данных и источником данных.

public partial class Form1 : Form
{
    private List<string> countries;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        countries = new List<string>();
        countries.Add("Australia");
        countries.Add("Belgium");
        countries.Add("Canada");
        comboBox1.DataSource = countries;
    }

    private void comboBox1_Leave(object sender, EventArgs e)
    {
        ComboBox combo = (sender as ComboBox);
        CurrencyManager cm = (combo.BindingContext[combo.DataSource] as CurrencyManager);
        if (!cm.List.Contains(combo.Text))
        {
            cm.List.Add(combo.Text);
            cm.EndCurrentEdit();
            cm.Refresh();
            cm.Position = cm.Count - 1;
        }
    }
}
...