Это гораздо сложнее сделать в WinForms, чем в WPF. WinForms имеет событие SelectedIndexChanged
, которое ничего не говорит о том, что уже было выбрано, плюс , оно запускается каждый раз, когда строка выбирается или отменяется.
Таким образом, если выбрана строка и вы выбрали другую строку, вы получите два события SelectedIndexChanged
:
- один после выбранной строки отменяется
- еще один при выборе новой строки.
Проблема в том, что во время события # 1 в ListView ничего не было выбрано, и вы не знаете, наступает ли событие # 2, которое выберет вторую строку.
Лучшее, что вы можете сделать, это подождать, пока ваше приложение не будет работать (через несколько миллисекунд после изменения выбора), и, если в списке пока ничего не выбрано, вернуть последнюю выбранную строку.
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
ListView lv = (ListView)sender;
if (lv.SelectedIndices.Count == 0)
{
if (!this.appIdleEventScheduled)
{
this.appIdleEventScheduled = true;
this.listViewToMunge = lv;
Application.Idle += new EventHandler(Application_Idle);
}
}
else
this.lastSelectedIndex = lv.SelectedIndices[0];
}
void Application_Idle(object sender, EventArgs e)
{
Application.Idle -= new EventHandler(Application_Idle);
this.appIdleEventScheduled = false;
if (listViewToMunge.SelectedIndices.Count == 0)
listViewToMunge.SelectedIndices.Add(this.lastSelectedIndex);
}
private bool appIdleEventScheduled = false;
private int lastSelectedIndex = -1;
private ListView listViewToMunge;