2015-01-16 4 views
0

Я хотел бы реализовать сценарий, который требует, чтобы я знал, выбирает ли пользователь элемент или отменяет все, нажимая на пустое пространство. В принципе, мне нужно сохранить первый элемент (который всегда существует). Должна быть возможность выбрать другой элемент, но как только пользователь нажмет на пустое место, и когда нормальный выбор будет удален, он должен вернуться к первому (по умолчанию) элементу.Winforms, ListView - этапы изменения выбора

Я попытался использовать выбранные изменения в элементе управления списком, но они запускаются в последовательности, которая не очень помогает: сначала выбранный элемент теряет выделение. Затем есть отдельное событие, указывающее, что выбран новый элемент.

Вопрос: когда событие ItemSelectionChanged запускается в первый раз, чтобы сказать, что ранее выбранный элемент больше не выбран, можно ли узнать, был ли этот элемент отменен, поскольку выбран другой элемент или потому что ничего не выбрано?

+0

Элемент управления должен получать только одно событие ввода (например, «MouseDown» или «KeyDown»), даже если вы получаете несколько событий «SelectionChanged». Таким образом, вы можете использовать это, чтобы различать группы событий «SelectionChanged», которые соответствуют однопользовательским входам. Если вам нужна более конкретная помощь, вероятно, вы должны показать пример кода, который ближе всего к тому, что вы хотите, объясняя, что он делает, и как это отличается от того, что вы хотите. См. Https://stackoverflow.com/help/mcve –

+0

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

ответ

1

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

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged; 

     if (!e.IsSelected) 
     { 
      listView1.Items[0].Selected = true; 
      listView1.Items[0].Focused = true; 
     } 
     else 
     { 
      listView1.Items[0].Selected = false; 
      listView1.Items[e.ItemIndex].Selected = true; 
     } 

     listView1.ItemSelectionChanged += listView1_ItemSelectionChanged; 
    } 
+0

Спасибо. Пробовал это, но результаты были странными. Иногда два элемента будут выделены. Я не понимал, почему, на самом деле, и поскольку я приступил к совершенно другому решению (см. Ниже), я не исследовал дальше. –

1

Спасибо за ответы.

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

0

Это будет помнить предыдущий выбор и сохранить его. (Мне это было нужно для моего проекта и здесь была какая-то помощь).

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     int temp = 0; 
     listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged; 
     if (!e.IsSelected) 
     { 
      temp = e.ItemIndex; 
      listView1.Items[temp].Selected = true; 
      listView1.Items[temp].Focused = true; 
     } 
     else 
     { 
      for (int y = listView1.Items.Count - 1; y >= 0; y--) 
      { 
       listView1.Items[y].Selected = false; 
      } 
      listView1.Items[e.ItemIndex].Selected = true; 
     } 
     listView1.ItemSelectionChanged += listView1_ItemSelectionChanged; 
    } 
Смежные вопросы