在 ComboBox 上使用 ContextMenuStrip

Using A ContextMenuStrip On A ComboBox

更新:

它似乎工作正常,但与我想象的方式不同。如果我使用 comboBox1 和 contextMenuStrip1 创建一个简单的项目,然后使用下图中显示的所有设置,它将显示我在下拉列表的文本区域中创建的上下文菜单就好了。我希望它在下拉列表的列表区域(包含所有列表项)中显示下拉菜单。

注意:这里的目标是让上下文菜单("Remove Item")显示在列表项(例如"Test2")的顶部。


我不知道为什么我会被如此微不足道的事情挂断电话,但这让我现在有点难过。我显然在做一些愚蠢的事情,看不到我做错了什么。我的目标很简单......通过设计 GUI,创建一个组合框对象和一个上下文菜单对象。我希望在右键单击组合框时弹出 contextmenustrip 对象。

我认为只要创建组合框对象然后在 ContextMenuStrip 上选择正确的 contextmenustrip 对象 属性 就可以了。似乎还有更多内容。

我做错了什么?

我不会在这里接受我自己的回答,因为这只是一种解决方法,而不是我原来问题的解决方案。我发布这篇文章的唯一原因是希望能为其他用户快速解决问题。

一种可能的解决方法是不使用上下文菜单删除项目,而是执行类似于许多应用程序的操作,只处理 KeyDown 事件以使用箭头键和删除键从列表中删除项目.

  1. 新建ProjectForm(Form1).
  2. 在新创建的上新建ComboBox(comboBox1) Form1.
  3. 将以下代码粘贴到 Form1...

Form1 代码段:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.Text = "Choose from list.";
        comboBox1.Items.Add("Test1");
        comboBox1.Items.Add("Test2");
        comboBox1.Items.Add("Test3");
    }

    private void comboBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Delete && comboBox1.DroppedDown)
        {
            //Remove the listitem from the combobox list
            comboBox1.Items.RemoveAt(comboBox1.SelectedIndex);

            //Make sure no other processing happens, ex: deleting text from combobox
            e.Handled = true;
        }
        else if (e.KeyCode == Keys.Down && !comboBox1.DroppedDown)
        {
            //If the down arrow is pressed show the dropdown list from the combobox
            comboBox1.DroppedDown = true;
        }
    }
}

现在 运行 程序并单击下拉菜单(或选项卡)如果它没有 selected。然后只需使用向下箭头显示组合框中的列表,然后 select 一个然后将其删除。

这并不像看起来那么容易。因为创建的下拉列表是动态创建的原生 ListBox window。要访问该列表框,您必须发送 下拉事件中的"CB_GETCOMBOBOXINFO"。

最好的方法是从 System.Windows.Forms.Combobox 像这里描述的: .NET Is it possible to have a contextmenu on an item of a combobox?

此 msdn 论坛上 here 提供了更准确的答案。这也给你一个例子。