【问题标题】:Add a right click event to a tab in a TabControl container将右键单击事件添加到 TabControl 容器中的选项卡
【发布时间】:2015-10-12 14:51:28
【问题描述】:

在一个表单中,我有一个选项卡容器,我在其中通过使用按钮动态添加选项卡。由于我知道(我还是 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);
        }
    }

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

【问题讨论】:

  • 关闭选项卡与从选项卡控件中删除是否相同,还是关闭选项卡与显示另一个选项卡相同?
  • 从标签控件中删除它。
  • 查看MouseUp / MouseDown 事件而不是msdn.microsoft.com/en-us/library/…
  • 它不起作用意味着:tab_click 没有被调用?发件人不是选定的标签? me.Button 不符合预期或标签未删除?
  • 参见here,了解如何将关闭添加按钮添加到选项卡

标签: c# winforms tabs tabcontrol


【解决方案1】:
private void tabControl1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        Application.Exit();
    }
    else
    {

    }
}

【讨论】:

    【解决方案2】:

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

    改为如下所示:

    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;
                }
            }
        }
    }
    

    【讨论】:

    • 出于好奇,有没有办法直接导航到触发事件的选项卡而不是遍历整个容器?
    • @AutomEng,据我所见。标签页是简单的容器,它们的标题没有任何信息。这些由选项卡控件本身处理和呈现,这就是需要这个循环的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多