Определение типа события, которое было вызвано в окне списка, Выбранное изменение индекса. C#

Я понимаю, что существуют вопросы об изменении индекса Listbox Select. Однако этот вопрос касается другого вопроса. У меня есть список с некоторыми строками в форме. То, что я пытаюсь сделать, - это иметь возможность прокручивать элементы в списке (т.е. использовать клавиши со стрелками для перехода к определенному элементу). Как только я перейду к нужному элементу, я хочу либо нажать клавишу ввода на элементе и продолжить свое приложение. Итак, вопрос заключается в том, как определить тип события, которое было вызвано в поле списка, чтобы сравнить событие с событием щелчка мыши или события Keydown, что позволяет мне решить, какой условный оператор выполнить на основе результата логического выражения...... Причина, по которой мне нужно определить тип, заключается в том, что если пользователь нажимает ENter на выбранном индексируемом элементе, появляется диалоговое окно, в настоящее время диалоговое окно появляется каждый раз, когда пользователь выделяет новый элемент (вы можете увидеть, как это это проблема).

Код Псуедо

    if (Listbox_Selected_Event_EventType isEqualTo Mouse_Click)
    {
        // execute code
    } else if (Listbox_Selected_Event_EventType isEqualTo KeydownEvent)
          {
             // execute code
          }

Законченный код благодаря Эвану,

    private void listBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                var file = Directory.GetFiles(urlHistoryFolder, listBox1.Text).FirstOrDefault();
                String line;
                try
                {
                    using (StreamReader sr = new StreamReader(file))
                    {
                        line = sr.ReadToEnd();
                    }

                    DialogResult result1 = MessageBox.Show("Are You sure you want to Load this WebService", "Important Question", MessageBoxButtons.YesNo);
                    if (result1 == DialogResult.Yes)
                    {
                        //MessageBox.Show("Loading WebService");
                        textEndPointUri.Text = line;
                        listBox1.Visible = false;
                        GetBtn_Click(sender, e);
                    }
                }
                catch (Exception exp)
                {
                    Console.WriteLine("File could not be read:");
                    Console.WriteLine(exp.Message);
                }
            }
        }
    }

3 ответа

Решение

Проблема в том, что вы смотрите на неправильное событие. Вы должны обращаться с MouseClick событие и KeyUp или же KeyDown событие в списке.

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            //Get the selected item and do whatever you need to it
            //Open your dialog box

        }
    }

    private void listBox1_Click(object sender, MouseEventArgs e)
    {
        //Get the selected item and do whatever you need to it
        //Open your dialog box
    }

Тогда нет необходимости в условном, поскольку вы обрабатывали оба события по отдельности. Убедитесь, что вы удалили код своего диалогового окна из SelectedIndexChanged событие.

РЕДАКТИРОВАТЬ:SelectedIndexChanged срабатывает каждый раз, когда вы выбираете и ListBox Объект. Ящик все еще хранит индекс, даже если вы не обрабатываете это событие. Таким образом, вы можете ссылаться или манипулировать СОБСТВЕННОСТЬЮ SelectedIndex в любом месте. Если вы обрабатываете два вышеупомянутых события, каждый раз, когда пользователь щелкает элемент или нажимает его, вы проверяете, есть ли выбранный элемент:

if (listBox1.SelectedIndex != -1)
{
    //Now we know you have an item selected
    //Do some stuff
}

Добавьте кнопку в форму и установите для этой кнопки свойство AcceptButton() формы. Теперь при нажатии Enter кнопка будет срабатывать. Отобразите ваше диалоговое окно в обработчике Button Click(). Это дает дополнительное преимущество, заключающееся в том, что люди могут также нажимать кнопку вместо нажатия Enter:

    private void button1_Click(object sender, EventArgs e)
    {
        if (ListBox.SelectedIndex != -1)
        {
            // ... display the dialog ...
            Console.WriteLine(ListBox.SelectedItem.ToString());
        }
    }

Чтобы определить, была ли нажата ENTER:

private void listBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Return)
        // do something
}
Другие вопросы по тегам