2016-09-12 4 views
0

Итак, благодаря многочисленным ответам на stackoverflow мы все знаем, как открыть контекстное меню, когда элемент в списке был правильно выбран. т.е .:Открытие контекстного меню в списке только в том случае, если не было нажата NO item

private void listviewItems_MouseClick(object sender, MouseEventArgs e) { 
    ListView tmp_SenderListView = sender as ListView; 
    if (e.Button == MouseButtons.Right) { 
     ListViewItem tmp_SelectedItem = tmp_SenderListView.GetItemAt(e.X, e.Y); 
     if (tmp_SelectedItem != null) { 
      tmp_SelectedItem.Selected = true; 
      contextMenuStripItem.Show(tmp_SenderListView, e.Location); 
     } 
    } 
} 

Моя цель состоит в том, чтобы открыть другой (другую) ContextMenu, когда пользователь щелкает внутри ListView, но не нажимает на элемент, а скорее пустое пространство. (Предпочтительно не срабатывает при нажатии на заголовок столбца)

Мои первые мысли были просто проверить, если выше tmp_SelectedItem был нулевой и, следовательно, нет пункта. когда я все же вложил корпус else и переключил его:

private void listviewItems_MouseClick(object sender, MouseEventArgs e) { 
    ListView tmp_SenderListView = sender as ListView; 
    if (e.Button == MouseButtons.Right) { 
     ListViewItem tmp_SelectedItem = tmp_SenderListView.GetItemAt(e.X, e.Y); 
     if (tmp_SelectedItem == null) { 
      contextMenuStripNoItem.Show(tmp_SenderListView, e.Location); 
     } 
     else { 
      tmp_SelectedItem.Selected = true; 
      contextMenuStripItem.Show(tmp_SenderListView, e.Location); 
     } 
    } 
} 

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

Я попытался с созданием contextMenuStripNoItem основной ContextMenuStrip в ListView, однако тогда он только не открыл contextMenuStripNoItem независимо от того, где и на то, что я нажал внутри ListView. Для добавления я попытался закрыть, что назначил contextMenuStrip, когда элемент был нажат и вместо этого открывает другой. Не работает.

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

Заранее спасибо :)

ответ

0

Попробуйте это (я изменил логику немного, если вы нажимаете на элемент, то он будет выбран, так что вы дон Не нужно проверять позиции X и Y. Если это подтверждено, показать menustrip1, если нет, поэтому правый щелчок не выполняется по пунктам, покажите menustrip2). Вы можете использовать событие Mouse_Up, которое запускает все события мыши listbox. Mouse_Click работает только при попадании предмета.

private void listView1_MouseUp(object sender, MouseEventArgs e) 
     { 
      ListView tmp_SenderListView = sender as ListView; 
      if (e.Button == MouseButtons.Right) 
      { 

       if (tmp_SenderListView.SelectedItems.Count > 0) 
       { 
        contextMenuStrip1.Show(tmp_SenderListView, e.Location); 
       } 
       else 
       { 
        contextMenuStrip2.Show(tmp_SenderListView, e.Location); 
       } 
      } 
     } 

Надежда помогает,

+0

Итак, я пробовал ваше решение сейчас, и он работает так же, как и другой, но почему он не работает, если я помещаю if внутри события MouseClick? – RememberOfLife

+0

@RememberOfLife Как я уже говорил, «Mouse_Click» работает только тогда, когда пользователь попадает на метку элемента внутри ListView. – Berkay

+0

Таким образом, очевидно, что он мгновенно открывается, если я нажимаю область без элементов и открывается только при выпуске, если я нажимаю элемент. Для меня не проблема. Спасибо :) – RememberOfLife

1

Попробуйте этот код

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
    { 
     if (listView1.SelectedItems.Count > 0) 
      e.Cancel = true; 

    } 
+0

Это должно быть кодом случае ContextMenuStrip, который открывается, когда ни один элемент не будет нажат, или тот, который открывается, когда элемент был щелкнул? – RememberOfLife

+0

Это событие contextMenuStrip Open –

 Смежные вопросы

  • Нет связанных вопросов^_^