У меня есть ListView в форме Windows в VB 2010.
Я установил свойство MultiSelect
объекта ListView
на False
, чтобы в любой момент можно было выбрать только один элемент.
Я настроил контекстное меню для ListView
, и оно правильно отображается при щелчке правой кнопкой мыши ListView
.
[Добавлен элемент управления ContextMenuStrip
в конструктор и установил для него свойство ContextMenuStrip
элемента ListView
.]
Рассмотрим два сценария:
Пользователь щелкает правой кнопкой мыши элемент, который уже выбран в
ListView
. Затем отображается контекстное меню, и проблем нет.Пользователь щелкает правой кнопкой мыши элемент, отличный от элемента, который уже выбран в
ListView
. Затем перед отображением контекстного меню выбирается элемент, который пользователь щелкнул правой кнопкой мыши.
В сценарии 2 мне нужно остановить автоматический выбор элемента, который пользователь щелкает правой кнопкой мыши. Необходимо контекстное меню для отображения, но ранее выбранный элемент должен оставаться выбранным.
Как я могу этого добиться?
Я заметил, что в событии ListView
MouseDown
свойство SelectedItems.Item(0).Index
все еще находится в старом индексе. Однако в событии MouseUp
это свойство изменяется на новый индекс.
Как я могу остановить изменение SelectedItems
в обработчике событий MouseDown
или где-нибудь еще? Или как я могу вернуть его к предыдущему выбранному элементу (так, чтобы пользователь не заметил, что он изменяется, а затем возвращается обратно)?
Я могу щелкнуть правой кнопкой мыши MouseDown
или MouseUp
, используя приведенный ниже код. Однако я не уверен, что мне нужно добавить в это условие, чтобы SelectedItems
не изменился.
If e.Button = Windows.Forms.MouseButtons.Right Then
...
End If
Примечание: я могу использовать для этого следующий код. Однако, когда я использую это со сценарием (2), он выбирает элемент, на котором пользователь щелкнул правой кнопкой мыши, а затем меняет его обратно на предыдущий элемент, и это изменение обратно видно пользователю. Следовательно, это решение нельзя использовать.
Dim intPrevSelectedIndex As Integer = -1
Dim boolCancel As Boolean = False
Private Sub ListView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDown
If ListView1.SelectedItems.Count > 0 AndAlso e.Button = Windows.Forms.MouseButtons.Right Then
boolCancel = True
intPrevSelectedIndex = ListView1.SelectedItems(0).Index
End If
End Sub
Private Sub ListView1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
If boolCancel Then
lstWalkResults.Items(intPrevSelectedIndex).Selected = True
boolCancel = False
End If
End Sub
Пожалуйста, дайте мне знать о любых возможных решениях. Спасибо за ваше время!