Отображение контекстного меню для элемента в ListView
Теперь пожалуйста, я знаю, как создать контекстный режим, который появляется, когда я нажимаю правой кнопкой мыши на listView, я хочу, чтобы он всплывал, когда я нажимаю правой кнопкой мыши на элемент. Я пытаюсь создать чат-сервер и клиент, и теперь... Теперь я хочу просмотреть информацию о клиенте, когда я нажимаю правой кнопкой мыши на подключенном элементе клиента. Теперь, как я могу это сделать?
Спасибо!
Ответы
Ответ 1
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (listView1.FocusedItem.Bounds.Contains(e.Location))
{
contextMenuStrip1.Show(Cursor.Position);
}
}
}
Вы можете поместить информацию о подключенном клиенте в contextMenuStrip1. и когда вы щелкаете правой кнопкой мыши по элементу, вы можете показать информацию из этого contextMenuStrip1.
Ответ 2
Вам нужно будет использовать контекстное меню ListViews, но измените его в соответствии с элементом ListView, который вы щелкните правой кнопкой мыши.
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
bool match = false;
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
foreach (ListViewItem item in listView1.Items)
{
if (item.Bounds.Contains(new Point(e.X, e.Y)))
{
MenuItem[] mi = new MenuItem[] { new MenuItem("Hello"), new MenuItem("World"), new MenuItem(item.Name) };
listView1.ContextMenu = new ContextMenu(mi);
match = true;
break;
}
}
if (match)
{
listView1.ContextMenu.Show(listView1, new Point(e.X, e.Y));
}
else
{
//Show listViews context menu
}
}
}
Ответ 3
Вы можете вызвать событие MouseDown
или MouseUp
ListView
, в котором if MouseButton.Right
затем захватить выбранный элемент с помощью ListView.Hittest
и предоставить контекстное меню, относящееся к этому выбранному элементу.
Более подробную информацию вы можете найти в этой ссылке
Ответ 4
Тема довольно старая, но я оставлю свое решение для справки.
В определении xaml ListView введите свое контекстное меню:
<ListView Name="m_list" >
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="menuItem1" Click="ContextMenuItem1Clicked" />
<MenuItem Header="menuItem2" Click="ContextMenuItem2Clicked" />
</ContextMenu>
</ListView.ContextMenu>
...
</ListView>
Теперь в коде определите два обработчика событий, которые будут запускаться при нажатии соответствующего пункта меню:
private void ContextMenuItem1Clicked(object sender, RoutedEventArgs e)
{
// handle the event for the selected ListViewItem accessing it by
ListViewItem selected_lvi = this.m_list.SelectedItem as ListViewItem;
}
private void ContextMenuItem2Clicked(object sender, RoutedEventArgs e)
{
// handle the event for the selected ListViewItem accessing it by
ListViewItem selected_lvi = this.m_list.SelectedItem as ListViewItem;
}
ListView может размещать объекты, а это значит, что selected_lvi может быть типа вашего объекта. Просто введите правильный тип.
Надеюсь, это поможет.
С уважением,
Mike
Ответ 5
Я нашел новое решение, которое не полагается на обработчики событий мыши.
ContextMenu имеет обработчик события "Popup".
Во всплывающем окне я добавляю соответствующие пункты меню, которые мне нужны, в зависимости от моего контекста.
Пример:
private MenuItem[] standardMenuItems;
private MenuItem[] selectedMenuItems;
public SomePanel() {
InitializeComponent();
// These are list of menu items (name / callback) that will be
// chosen depending on some context
standardMenuItems = new MenuItem[] { new MenuItem("New", OnNew) };
selectedMenuItems = new MenuItem[] { new MenuItem("Delete", OnDelete), new MenuItem("Edit", OnEdit) };
ContextMenu contextMenu = new ContextMenu();
// begin with "standard items"
contextMenu.MenuItems.AddRange(standardMenuItems);
listview.ContextMenu = contextMenu;
// add the popup handler
contextMenu.Popup += OnMenuPopup;
}
// Called right before the menu comes up
private void OnMenuPopup(object sender, EventArgs e) {
ContextMenu menu = sender as ContextMenu;
if (menu == null)
return;
// If an item was selected, display Delete and Edit options
if (listview.SelectedItems.Count > 0) {
menu.MenuItems.Clear();
menu.MenuItems.AddRange(selectedMenuItems);
}
// Else display only the New option
else {
menu.MenuItems.Clear();
menu.MenuItems.AddRange(standardMenuItems);
}
}
Я недостаточно свободно владею С# и Winforms, чтобы быть уверенным, что нет никаких недостатков в этой технике, но это альтернатива полагаться на события мыши (что, если/может ли контекстное меню отображаться на другой клавиатуре или мыши? )
Ответ 6
private void contextMenuStripExport_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
if (exportview.SelectedItems.Count <= 0)
{
uploadToolStripMenuItem.Visible = false;
exportToolStripMenuItem.Visible = false;
}
else
{
uploadToolStripMenuItem.Visible = true;
exportToolStripMenuItem.Visible = true;
}
}
Ответ 7
Полностью решение
- Появляется, когда пользователь щелкает правой кнопкой мыши элемент в списке.
- Избегайте исключений, если в списке нет элементов.
- Если элемент был выбран, отобразите параметры удаления и редактирования.
![enter image description here]()
Код:
private void Form1_Load(object sender, EventArgs e)
{
listView1.MouseUp += new MouseEventHandler(listView1_MouseClick);
}
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
string id = "xxx";//extra value
if (e.Button == MouseButtons.Right)
{
if (listView1.FocusedItem != null && listView1.FocusedItem.Bounds.Contains(e.Location) == true)
{
ContextMenu m = new ContextMenu();
MenuItem cashMenuItem = new MenuItem("編輯");
cashMenuItem.Click += delegate (object sender2, EventArgs e2) {
ActionClick(sender, e, id);
};// your action here
m.MenuItems.Add(cashMenuItem);
MenuItem cashMenuItem2 = new MenuItem("-");
m.MenuItems.Add(cashMenuItem2);
MenuItem delMenuItem = new MenuItem("刪除");
delMenuItem.Click += delegate (object sender2, EventArgs e2) {
DelectAction(sender, e, id);
};// your action here
m.MenuItems.Add(delMenuItem);
m.Show(listView1, new Point(e.X, e.Y));
}
}
}
private void DelectAction(object sender, MouseEventArgs e, string id)
{
ListView ListViewControl = sender as ListView;
foreach (ListViewItem eachItem in ListViewControl.SelectedItems)
{
// you can use this idea to get the ListView header name is 'Id' before delete
Console.WriteLine(GetTextByHeaderAndIndex(ListViewControl, "Id", eachItem.Index) );
ListViewControl.Items.Remove(eachItem);
}
}
private void ActionClick(object sender, MouseEventArgs e, string id)
{
//id is extra value when you need or delete it
ListView ListViewControl = sender as ListView;
foreach (ListViewItem tmpLstView in ListViewControl.SelectedItems)
{
Console.WriteLine(tmpLstView.Text);
}
}
public static string GetTextByHeaderAndIndex(ListView listViewControl, string headerName, int index)
{
int headerIndex = -1;
foreach (ColumnHeader header in listViewControl.Columns)
{
if (header.Name == headerName)
{
headerIndex = header.Index;
break;
}
}
if (headerIndex > -1)
{
return listViewControl.Items[index].SubItems[headerIndex].Text;
}
return null;
}