Dot Net Perls

ContextMenuStrip Example - C#

by Sam Allen

Problem

Add context menus to your Windows Forms program. Context menus should appear when your user right-clicks. Context menus react to their surroundings. For example, a Copy option should appear if text is selected. Associate different controls with different context menus.

Solution: C# .NET

First, here is how to create ContextMenu controls in your Windows Forms program. For the example, you may have a TextBox on the form, which you can name anything you want. I will call it textBox1 in this guide. Now, let's make the ContextMenu control.

  1. First get oriented
    Look at the Toolbox, which is usually a tab or panel on the left. Click on the Menus & Toolbars heading, and you will see a list of items.
  2. ContextMenuStrip item
    Double-click on the ContextMenuStrip item and then enter some text such as "Copy" in the gray box in the context menu.

Use the ContextMenuStrip property

Each Windows Forms control has a ContextMenuStrip property. The job of the Visual Studio Designer view is to allow us to visually set those properties. We can do this by following steps similar to those that follow here.

  1. Click on control
    First, click on the TextBox, textBox1, you may have on your form. On the right side of your Visual Studio window, you may have a Properties pane.
  2. Select property
    There are buttons near the top, and you can select the A-Z listing. In the A-Z listing, you will see an alphabetized list of properties. We want the ContextMenuStrip property.

Change "Click" events

We need to make the context menu actually do something. First, let's make it perform a Copy on textBox1 when the user clicks on it. Go ahead and double click on your custom menu item, which will create an event handler that looks like this. In our example, we use the Copy method call.

private void copyToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Here, add the copy command to the relevant control, such as...
    textBox1.Copy(); // added manually
}

Use the Opening event

First, click on the ContextMenu and then look at Properties pane on the right. Then click on the lightning bolt in Properties pane. Finally, scroll down to Opening and double-click to the right of Opening. You will see the following code appear.

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    // Runs before the user sees anything. A great place to set
    // Enabled to true or false.
}

Add to event

We need to change the contents of the above event handler. Let's it to set the Copy menu item as Enabled when the selection is present, and disabled when there is no selection. Modify the above code to look like the following code.

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    // An elegant way to make the ContextMenu item always be Enabled
    // when there is a selection, and always disabled when there isn't.
    copyToolStripMenuItem1.Enabled = textBox1.SelectionLength > 0;
}

What we've accomplished

What we have accomplished here is a way to disable the context menu's items depending on other factors in the UI. You won't need to manage the ToolStripMenuItem objects in any other way, other than the check for whether you want them in the Opening event. When text is selected, the Copy menu item is enabled.

Conclusion

ContextMenuStrip is a useful control and it can truly bring a higher level of interactivity to your Windows Forms programs. Finally, check out my article about StatusStrip, which is related and important for Windows Forms.

Dot Net Perls
About
Sitemap
Source code
RSS
Windows Forms
DataGridView Tips and Secrets
DataTable Example
BackgroundWorker Thread Use
ContextMenuStrip Example
Customized Dialog Box for Windows
Recent
Pi
NGEN Installer Class
List Element Equality
DateTime Tips and Tricks
Remove HTML Tags From String
© 2008 Sam Allen. All rights reserved.