Определение типа события, которое было вызвано в окне списка, Выбранное изменение индекса. 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
}