2008-11-10 7 views
4

Когда программа запускается, существует серия форм ListView. Мы заполнили один из них элементами (как строки), и мы проверяем, изменилось ли состояние выбора. После его изменения мы захватываем текст выбранного элемента с помощью FocusedItem.Text. Первый раз работает отлично, но когда сделан другой выбор, выбранный элемент возвращается как null.ListView FocusedItem становится NULL

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

Любые идеи?

+0

Я столкнулся с этой же проблемой в VS2010. Фокусировка была нулевой, и я не мог получить значения SelectedIndices или SelectedItems больше нуля. Я попробовал решение mukunda ниже, и он начал работать. Затем я расчленял и в конечном итоге отключил его решение, и он продолжал работать. Теперь у меня нет проблем, и фактически я не менял никакого кода. Поэтому я предполагаю, что это была какая-то странная ошибка компиляции VS. –

ответ

0

Я запустил тестовую программу и не вижу экземпляра, где FocusedItem может быть пустым.

Не могли бы вы выслать какой-нибудь код?

Вот что я получил после того, как я выбираю пункт «а» затем выбирает пункт «б», а затем нажмите на пустом месте:

ItemSelectionChanged 
    Item   : ListViewItem: {a} 
    IsSelected : True 
    SelectedItem : ListViewItem: {a} 
    FocusedItem : ListViewItem: {a} 
SelectedIndexChanged 
    SelectedItem : ListViewItem: {a} 
    FocusedItem : ListViewItem: {a} 
ItemSelectionChanged 
    Item   : ListViewItem: {a} 
    IsSelected : False 
    SelectedItem : null 
    FocusedItem : ListViewItem: {a} 
SelectedIndexChanged 
    SelectedItem : null 
    FocusedItem : ListViewItem: {a} 
ItemSelectionChanged 
    Item   : ListViewItem: {b} 
    IsSelected : True 
    SelectedItem : ListViewItem: {b} 
    FocusedItem : ListViewItem: {b} 
SelectedIndexChanged 
    SelectedItem : ListViewItem: {b} 
    FocusedItem : ListViewItem: {b} 
ItemSelectionChanged 
    Item   : ListViewItem: {b} 
    IsSelected : False 
    SelectedItem : null 
    FocusedItem : ListViewItem: {b} 
SelectedIndexChanged 
    SelectedItem : null 
    FocusedItem : ListViewItem: {b} 

Замечен, что FocusedItem никогда не нуль.

Это то же самое в вашем случае?

Может ли простая проверка if (listView.FocusedItem == null) сделать ваш случай?

1

Если вы после пункта, который выбрал пользователь, вы должны использовать первый элемент в коллекции SelectedItems. FocusedItem - элемент, который в настоящее время имеет фокус клавиатуры (и, следовательно, показывает прямоугольник с точками фокусировки); если элемент управления не имеет фокуса, ни один элемент не может быть.

0

У меня была такая же проблема при использовании listview. Кажется, что есть какая-то проблема в отношении события, выпущенного после выбора.

  1. SelectedIndexChanged событие, в котором сфокусированный элемент, выбранные элементы и выбранные индексы становятся нулевыми. Это и есть причина вышеупомянутой проблемы.
  2. ItemActivate Событие может использоваться альтернативно без каких-либо сбоев, где сфокусированный элемент, выбранные элементы или выбранные индексы не являются нулевыми во втором или в любое другое время.

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

В классе дизайнера см. Мероприятие, подписанное. Пример:

this.TaskslistView.SelectedIndexChanged 
     += new System.EventHandler(TaskslistView_SelectedIndexChanged); 

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

this.TaskslistView.ItemActivate 
     += new System.EventHandler(this.TaskslistView_ItemActivate); 

и замените соответствующий TaskslistView_SelectedIndexChanged с TaskslistView_ItemActivate.

Это должно решить проблему.

2

Поместите следующее условие вокруг в OnSelectedIndexHandler:

if(listViewObject.SelectedItems!=null&& listViewObject.SelectedItems.Count>0) 
{ 
    //....your code here 
} 
0

Вы можете использовать ListViewItemSelectionChangedEventHandler.

ListView.ItemSelectionChanged += 
new ListViewItemSelectionChangedEventHandler(ListView_ItemSelectionChanged); 

private void ListView_ItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e) 
{ 
    var x = e.IsSelected; 
} 

ListView_ItemSelectionChanged вызывается дважды. Вы можете игнорировать первый с помощью

if (e.IsSelected == true) 

редактировать: Попробуйте это:

ListView.Select();