Подтвердить что ты не робот

Отображение контекстного меню для элемента в ListView

Теперь пожалуйста, я знаю, как создать контекстный режим, который появляется, когда я нажимаю правой кнопкой мыши на listView, я хочу, чтобы он всплывал, когда я нажимаю правой кнопкой мыши на элемент. Я пытаюсь создать чат-сервер и клиент, и теперь... Теперь я хочу просмотреть информацию о клиенте, когда я нажимаю правой кнопкой мыши на подключенном элементе клиента. Теперь, как я могу это сделать?

Спасибо!

4b9b3361

Ответ 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;
}