Tweaking ContextMenu's for List Items
A little System.Windows.Forms diversion. One thing that's ill-documented, imho, is the CheckedListBox. And if you then want to add a context menu that's context sensitive to the Item in the list you are over, then good luck finding any useful info. Therefore, I figured i put this snippet in here before I forget again how do deal with this.
The best example I found for handling ContextMenu in the context of a list item recommended completely ignoring the ContextMenu property on the listbox and handling it all in the MouseDown event--creating the context menu on the fly and all.
That seemed a little overkill to me since all i wanted to to do was disable the one item Edit on the context menu. So, instead i capture the Popup event and tweak my menu there. First the setup of the context menu (in my constructor):
ContextMenu contextMenu = new ContextMenu(); MenuItem edit = new MenuItem("Edit"); contextMenu .MenuItems.Add(edit); edit.Click += new EventHandler(edit_Click); contextMenu .Popup +=new EventHandler(contextMenu _Popup); checkedListBox.ContextMenu = contextMenu;
And here's the popup handler:
private void contextMenu_Popup(object sender, EventArgs e) { //don't forget to translate the mouse coordinates to the control local coordinates int index = checkedListBox.IndexFromPoint(checkedListBox.PointToClient(MousePosition)); if( index == -1 || !checkedListBox.GetItemChecked(index) ) { ((ContextMenu)sender).MenuItems[0].Enabled = false; } else { ((ContextMenu)sender).MenuItems[0].Enabled = true; //storing the index in a class field so that i don't have to //do the math again and in case the mouse moved contextSelection = index; } }

0 Comments:
Post a Comment
<< Home