向 TabControl 容器中的选项卡添加右键单击事件

Add a right click event to a tab in a TabControl container

在一个表单中,我有一个选项卡容器,我通过使用按钮在其中动态添加选项卡。由于我知道没有简单的方法(然后我是 WinForms 新手)关闭所选选项卡,我想设置一个事件处理程序来处理右键单击,通过该选项卡将关闭。简而言之,我想右键单击所选选项卡以将其关闭。

这是我编写的事件处理程序(但不起作用):

private void tab_Click(object sender, EventArgs e)
    {
        MouseEventArgs me = (MouseEventArgs)e;
        if (sender == tabControl1.SelectedTab && me.Button == MouseButtons.Right)
        {
            tabControl1.TabPages.Remove(tabControl1.SelectedTab);
        }
    }

我想这种方法太天真了吧?当我单击选项卡时,处理程序甚至没有注册右键单击。对如何使这项工作有任何建议吗?

private void tabControl1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        Application.Exit();
    }
    else
    {

    }
}

您这里的代码非常不稳定。不要盲目地转换 EventArgs 对象,只需使用 MouseClick 事件即可。不要盲目希望 SelectedTab 是被点击的那一个,那是稍后发生的。而且永远不会,永远不会 那样使用 Remove() 方法,处理 TabPage 及其控件非常重要。如果您不这样做,那么这些控件将永久泄漏,这种错误最终会导致您的程序崩溃并出现不可调试的异常,例如 "Error creating window".

让它看起来像这样:

private void tabControl1_MouseClick(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Right) {
        for (int ix = 0; ix < tabControl1.TabCount; ++ix) {
            if (tabControl1.GetTabRect(ix).Contains(e.Location)) {
                tabControl1.TabPages[ix].Dispose();
                break;
            }
        }
    }
}