在 ComboBox 上使用 ContextMenuStrip
Using A ContextMenuStrip On A ComboBox
更新:
它似乎工作正常,但与我想象的方式不同。如果我使用 comboBox1 和 contextMenuStrip1 创建一个简单的项目,然后使用下图中显示的所有设置,它将显示我在下拉列表的文本区域中创建的上下文菜单就好了。我希望它在下拉列表的列表区域(包含所有列表项)中显示下拉菜单。
注意:这里的目标是让上下文菜单("Remove Item")显示在列表项(例如"Test2")的顶部。
我不知道为什么我会被如此微不足道的事情挂断电话,但这让我现在有点难过。我显然在做一些愚蠢的事情,看不到我做错了什么。我的目标很简单......通过设计 GUI,创建一个组合框对象和一个上下文菜单对象。我希望在右键单击组合框时弹出 contextmenustrip 对象。
我认为只要创建组合框对象然后在 ContextMenuStrip 上选择正确的 contextmenustrip 对象 属性 就可以了。似乎还有更多内容。
我做错了什么?
我不会在这里接受我自己的回答,因为这只是一种解决方法,而不是我原来问题的解决方案。我发布这篇文章的唯一原因是希望能为其他用户快速解决问题。
一种可能的解决方法是不使用上下文菜单删除项目,而是执行类似于许多应用程序的操作,只处理 KeyDown 事件以使用箭头键和删除键从列表中删除项目.
- 新建
Project
和Form
(Form1).
- 在新创建的上新建
ComboBox
(comboBox1) Form1.
- 将以下代码粘贴到 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 提供了更准确的答案。这也给你一个例子。
更新:
它似乎工作正常,但与我想象的方式不同。如果我使用 comboBox1 和 contextMenuStrip1 创建一个简单的项目,然后使用下图中显示的所有设置,它将显示我在下拉列表的文本区域中创建的上下文菜单就好了。我希望它在下拉列表的列表区域(包含所有列表项)中显示下拉菜单。
注意:这里的目标是让上下文菜单("Remove Item")显示在列表项(例如"Test2")的顶部。
我不知道为什么我会被如此微不足道的事情挂断电话,但这让我现在有点难过。我显然在做一些愚蠢的事情,看不到我做错了什么。我的目标很简单......通过设计 GUI,创建一个组合框对象和一个上下文菜单对象。我希望在右键单击组合框时弹出 contextmenustrip 对象。
我认为只要创建组合框对象然后在 ContextMenuStrip 上选择正确的 contextmenustrip 对象 属性 就可以了。似乎还有更多内容。
我做错了什么?
我不会在这里接受我自己的回答,因为这只是一种解决方法,而不是我原来问题的解决方案。我发布这篇文章的唯一原因是希望能为其他用户快速解决问题。
一种可能的解决方法是不使用上下文菜单删除项目,而是执行类似于许多应用程序的操作,只处理 KeyDown 事件以使用箭头键和删除键从列表中删除项目.
- 新建
Project
和Form
(Form1). - 在新创建的上新建
ComboBox
(comboBox1) Form1. - 将以下代码粘贴到 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 提供了更准确的答案。这也给你一个例子。