Выбранный индекс C # combobox изменяет старое значение - PullRequest
1 голос
/ 18 декабря 2009

У меня есть ситуация, когда я хочу изменить выбранное значение поля со списком в приложении 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));
    }
}

Ответы [ 2 ]

1 голос
/ 18 декабря 2009

Это вызвано тем, что по умолчанию, если в выпадающем списке есть фокус, то нажатие влево и вправо (без управления) изменит значение.

Вы перехватываете ctrl-left, увеличиваете значение ... и затем передаете нажатие клавиши базовому объекту, который интерпретирует нажатие левой клавиши и уменьшает выбранный элемент.

Измените свой код следующим образом, чтобы проглотить нажатие клавиши, и все, кажется, работает как ожидалось:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Left))
        {
            DoUpdate();
            return true;
        }
        else
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
0 голосов
/ 18 декабря 2009

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

Мы делаем что-то подобное, когда у нас есть куча событий, привязанных к спискам и спискам во время загрузки формы. Мы устанавливаем значения и не хотим, чтобы события запускались во время загрузки, поэтому у нас есть флаг, который удерживает события от запуска до завершения загрузки формы.

Я думаю, что вы устанавливаете значение, но что-то еще заставляет произойти второе событие изменения выбранного элемента. Однако это также выглядит так, как будто вы можете попасть в бесконечный цикл, поскольку вы устанавливаете selectedindex в методе DoUpdate и в методе SetComboValue.

Просто измените выбранный индекс в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...