2010-08-24 4 views

ответ

4

Вы можете использовать событие Opening. Событие args имеет свойство Cancel, чтобы вы могли проверить состояние своего приложения и решить, показывать ли меню (ничего не делая) или не показывать его (путем установки e.Cancel = true). Однако, как упоминает @Grzenio, я бы нашел более интуитивно понятным, если элемент, который я щелкнул правой кнопкой, стал автоматически выбран.

Другой вариант - использовать событие Opening, чтобы заполнить контекстное меню только одним отключенным элементом с текстом, например (no item is selected); это сообщит пользователю о том, почему команда недоступна.

+0

Я использовал это с if (List.SelectedItems.Count == 0) {e.Cancel = true;} Спасибо! – sooprise

2

Для меня интуитивно понятно, что если у вас нет выбранных элементов (или вы щелкните правой кнопкой мыши на не выбранном элементе), элемент будет автоматически выбран непосредственно перед отображением контекстного меню.

Если первое решение неприемлемо, я думаю, что я попытаюсь прикрепить ContextMenuStrip, когда элементы будут выбраны, и отделите его, когда они не будут выбраны.

+0

Единственная проблема (и очень незначительная) заключается в том, что если пользователь щелкает правой кнопкой мыши заголовки столбцов списка, меню все же появляется. Я попытаюсь реализовать второе предложение, спасибо! – sooprise

1
Private Sub ListView1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp 
     If e.Button = MouseButtons.Right And ListView1.SelectedItems.Count > 0 Then 
      Dim cn As New ContextMenuStrip() 
      cn.Items.Add("Apple") 
      Me.ListView1.ContextMenuStrip = cn 
      cn.Show(Control.MousePosition.X, Control.MousePosition.Y) 
     End If 
    End Sub 
3

Для других людей, читающих эту тему, хороший способ является серым цветом параметры в меню (в эвента), когда никакие пункты не выбраны вместо не отображает меню на всех

if (List.SelectedItems.Count == 0) 
{ 
    // e.Cancel=true; 
    List.Enabled = false; 
} 
else 
{ 
    List.Enabled = true; 
}