У нас есть проект, который устанавливает DataSource комбинированного списка, но позволяет пользователям либо выбрать что-то из этого списка, либо ввести элемент, которого нет в списке. По сути, есть Geobase, которая содержит улицы, но пользователи не обязаны выбирать улицу из списка. ComboBox.DropDownStyle имеет значение DropDown.
Если пользователь редактирует запись, которая содержит улицу НЕ в геобазе (и, следовательно, не в ComboBox.DataSource), у нас возникают проблемы с заполнением формы правильно.
Вот очень упрощенная форма нашей задачи:
private void button1_Click(object sender, EventArgs e)
{
// Create a new form. In the constructor the DataSource of the ComboBox is set with three items:
// Main St., First St., and Second St.
ComboBoxTrialForm frm = new ComboBoxTrialForm();
// Set comboBox1.Text equal to an item NOT in the datasource
frm.SetComboTextValue("Michigan Ave.");
// Show the form, and the comboBox has the first item in its datasource selected
frm.Show();
}
Класс ComboBoxTrial работает примерно так:
public partial class ComboBoxTrialForm : Form
{
public ComboBoxTrialForm()
{
InitializeComponent();
List<string> streets = new List<string>() { "Main St.", "First St.", "Second St." };
comboBox1.DataSource = streets;
}
public void SetComboTextValue(string text)
{
comboBox1.Text = text;
}
}
Я установил точки останова и обнаружил, что comboBox1.Text действительно настроен правильно. Интересно, что я обнаружил, что событие BindingContextChanged фактически запускается дважды в этом упрощенном примере. Один раз в конструкторе, когда вызывается comboBox1.DataSource = streets
, и второй раз, когда вызывается frm.Show()
.
Почему это событие вызывается, когда отображается форма, и поэтому мой выбранный вручную выбор удаляется? Как мне исправить это поведение?
Кроме того, я ошибаюсь, полагая, что я должен быть в состоянии использовать комбинированный список таким образом?
Заранее спасибо.