Вот короткая программа, которая воспроизводит проблему, с которой я столкнулся. Это было скомпилировано под MS Windows 7 с .NET 4.0, на всякий случай это имеет значение.ComboBox SelectionChangeCommitted событие не работает с автозаполнением
using System;
using System.Drawing;
using System.Windows.Forms;
// Compile with "csc /target:exe /out:comboboxbug.exe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll comboboxbug.cs"
// in a Visual Studio command prompt.
static class Program
{
[STAThread]
static void Main()
{
//Create a label.
Label oLabel = new Label();
oLabel.Location = new Point (10, 10);
oLabel.Size = new Size (100, 15);
oLabel.Text = "Combo box bug:";
// Create a combo-box.
ComboBox oComboBox = new ComboBox();
oComboBox.Location = new Point (10, 50);
oComboBox.Size = new Size (150, 21);
oComboBox.Items.AddRange (new object[]
{ "A", "A B", "A C", "A B C", "A C B", "A B C D", "A C B D" });
oComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
oComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
oComboBox.SelectionChangeCommitted
+= new EventHandler (comboBox_SelectionChangeCommitted);
// Create a form.
Form oForm = new Form();
oForm.Size = new Size (200, 150);
oForm.Controls.Add (oLabel);
oForm.Controls.Add (oComboBox);
// Run this form.
Application.Run (oForm);
}
static void comboBox_SelectionChangeCommitted (object sender,
EventArgs e)
{
MessageBox.Show ("SelectionChangeCommitted");
}
}
Нажмите в текстовой части комбинированного блока и введите «A». Вы получите список предложений автозаполнения. Выберите один из вариантов с помощью мыши. Событие SelectionChangeCommitted
не происходит!
Выберите пункт меню без использования автозаполнения. Вы получите сообщение с сообщением о том, что произошло событие SelectionChangeCommitted
!
Учитывая, что выбор был изменен пользователем в обоих случаях, не следует ли в обоих случаях вызывать SelectionChangeCommitted
?
Использование события SelectedIndexChanged
не является обязательным, поскольку для приложения, стоящего за этим законченным примером, я хочу только, чтобы это произошло, когда пользователь делает выбор, а не когда он установлен программно.
Я пробовал ваш код, но все отлично. – spajce
Любая возможность [эта проблема] (http://stackoverflow.com/questions/13291945/winforms-combobox-loses-autocomplete-value-on-lostfocus) вообще помогает? – Guvante
@spajce: Я запустил исходный код примера, как написано, и продублировал описанное поведение. Win 8, VS 2010, .NET 4. Обратите внимание, что ожидаемое поведение появляется при выборе значения как части автоматического завершения. – Guvante