我有一个ListBox,我想为列表中的每个项目添加一个上下文菜单.我已经看到"解决方案"右键单击选择一个项目并禁止上下文菜单,如果在空白区域,但这个解决方案感觉很脏.
有谁知道更好的方法?
只是详细说明Frans所说的内容......即使ListBox拥有ContextMenuStrip,您仍然可以在菜单条打开时自定义菜单条中的项目.因此,根据列表框中的鼠标位置自定义其内容.
下面的示例基于鼠标右键单击选择列表框中的项目,然后根据用户右键单击的项目自定义上下文菜单条.这是一个简单的示例,但应该让您:将列表框添加到表单并添加以下代码:
print(" #region Private Members private ContextMenuStrip listboxContextMenu; #endregion private void Form1_Load( object sender, EventArgs e ) { //assign a contextmenustrip listboxContextMenu = new ContextMenuStrip(); listboxContextMenu.Opening +=new CancelEventHandler(listboxContextMenu_Opening); listBox1.ContextMenuStrip = listboxContextMenu; //load a listbox for ( int i = 0; i < 100; i++ ) { listBox1.Items.Add( "Item: " + i ); } } private void listBox1_MouseDown( object sender, MouseEventArgs e ) { if ( e.Button == MouseButtons.Right ) { //select the item under the mouse pointer listBox1.SelectedIndex = listBox1.IndexFromPoint( e.Location ); if ( listBox1.SelectedIndex != -1) { listboxContextMenu.Show(); } } } private void listboxContextMenu_Opening( object sender, CancelEventArgs e ) { //clear the menu and add custom items listboxContextMenu.Items.Clear(); listboxContextMenu.Items.Add( string.Format( "Edit - {0}", listBox1.SelectedItem.ToString() ) ); } ");
希望有所帮助.-麦克风
这样,菜单将在鼠标旁边弹出
private string _selectedMenuItem; private readonly ContextMenuStrip collectionRoundMenuStrip; public Form1() { var toolStripMenuItem1 = new ToolStripMenuItem {Text = "Copy CR Name"}; toolStripMenuItem1.Click += toolStripMenuItem1_Click; var toolStripMenuItem2 = new ToolStripMenuItem {Text = "Get information on CR"}; toolStripMenuItem2.Click += toolStripMenuItem2_Click; collectionRoundMenuStrip = new ContextMenuStrip(); collectionRoundMenuStrip.Items.AddRange(new ToolStripItem[] {toolStripMenuItem1, toolStripMenuItem2 }); listBoxCollectionRounds.MouseDown += listBoxCollectionRounds_MouseDown; } private void toolStripMenuItem2_Click(object sender, EventArgs e) { var info = GetInfoByName(_selectedMenuItem); MessageBox.Show(info.Name + Environment.NewLine + info.Date); } private void toolStripMenuItem1_Click(object sender, EventArgs e) { Clipboard.SetText(_selectedMenuItem); } private void myListBox_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Right) return; var index = myListBox.IndexFromPoint(e.Location); if (index != ListBox.NoMatches) { _selectedMenuItem = listBoxCollectionRounds.Items[index].ToString(); collectionRoundMenuStrip.Show(Cursor.Position); collectionRoundMenuStrip.Visible = true; } else { collectionRoundMenuStrip.Visible = false; } }