У меня есть ситуация, когда я хочу изменить выбранное значение поля со списком в приложении Windows Forms с помощью Ctrl-Left или Ctrl-Right. Однако, если выпадающий список является выбранным элементом управления в форме, это не работает. Выбранное значение устанавливается на старое значение после того, как оно установлено на новое значение. Если в выпадающем списке нет выбранного элемента управления, все работает нормально. В моем приложении комбо может получить фокус, потому что значения также могут быть изменены с помощью мыши. Хотя то, что я хочу, может быть достигнуто путем выбора какого-либо другого элемента управления в форме перед тем, как фактически изменить значение, мне не очень нравится это решение.
Итак, есть два вопроса: почему событие selectedIndexChanged вызывается старым значением, если в поле со списком выбран элемент управления в форме, и
Как можно избежать этого или если я не могу, что такое хороший обходной путь? Далее приведен код, иллюстрирующий мою проблему. Если вы уроните поле со списком и поле с расширенным текстом в форму и скопируете приведенный ниже код в Form1.cs, вы увидите мою проблему. Вам нужно сделать комбо стиль DropDownList и добавить несколько чисел в качестве элементов (1, 2, 3 в порядке)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.Left))
{
DoUpdate();
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void DoUpdate()
{
int index = Convert.ToInt32(comboBox1.SelectedItem);
index++;
if (comboBox1.Focused)
richTextBox1.Select();
comboBox1.SelectedItem = index.ToString();
}
private void SetComboValue(int value)
{
comboBox1.SelectedItem = value.ToString();
richTextBox1.AppendText(string.Format("Set value {0} \r\n", value.ToString()));
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
richTextBox1.AppendText(string.Format("Selected index changed before {0}\r\n", comboBox1.SelectedItem));
SetComboValue(Convert.ToInt32(comboBox1.SelectedItem));
richTextBox1.AppendText(string.Format("Selected index changed after {0}\r\n", comboBox1.SelectedItem));
}
}