C #: Как получить фактический элемент, выбранный из SelectedIndexChanged для элемента управления ListView? - PullRequest
2 голосов
/ 22 января 2009

Я работаю с приложением winForms, у которого есть listView. В этом listView включена функция множественного выбора, и у меня есть много, много элементов в списке (в виде строк).

Когда я выбираю последнюю строку (то есть элемент), а затем нажимаю Shift при щелчке 5000-й строки, SelectedIndexChanged срабатывает 5000 раз. Если это произойдет, я попаду в очень неприятную петлю. Последнее нажатие строки не обязательно является последним элементом в списке «SelectedItems». Как я могу получить фактический элемент нажал?

РЕДАКТИРОВАТЬ: Лучшее пояснение: Как я могу получить ListViewItem, который вызвал эту конкретную итерацию события SelectedIndexChanged? ... даже если я должен проверить все 5000 из них. Мне нужно знать, на кого я смотрю. EventArgs не имеет свойства индекса, и отправителем является ListView, а не ListViewItem.

Есть мысли?

Ответы [ 3 ]

10 голосов
/ 22 января 2009

ОН, ДЛЯ ЛЮБВИ ПИТА ... (* чувствует себя тупее, чем камень *)

Я нашел свой ответ. Обратите внимание, что я использую SelectedIndexChanged. Есть еще одно событие, которое я должен использовал: ItemSelectionChange.

При использовании этого события у меня теперь есть события, которые могут сказать мне, какие элементы изменились в выделении, и он сообщает мне, был ли элемент выбран или не выбран. Это прекрасно.

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

1 голос
/ 22 января 2009

На ListView существует метод HitTest. Обрабатывая событие MouseClick, вы можете определить, какой последний элемент был нажат.

Если вы хотите выяснить, каким был последний выбранный элемент, не забудьте клавиатуру. В элементе управления представлением списка вы можете удерживать Ctrl+(arrow key), чтобы переместить прямоугольник фокуса, а затем нажать Ctrl+Space, чтобы добавить к выделению. Если вы хотите последний выбранный элемент, вам придется справиться и с этим.

1 голос
/ 22 января 2009

Вот лучшее решение, которое я могу придумать. Обработайте событие ListView OnMouseMove. Всякий раз, когда мышь перемещается, запишите местоположение мыши. Затем, когда вы получаете SelectedIndexChangedEvent, вы можете вызвать ListView.FindNearestItem (SearchDirectionHint, Point) и передать последние координаты мыши в качестве параметра Point. Это должно дать вам элемент, который был фактически нажат.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...