使用中间鼠标按钮关闭WinForms选项卡控件中的选项卡

9
有没有简单的方法(5行代码)可以做到这一点?
4个回答

23
使用LINQ,删除鼠标中键点击的选项卡的最短代码。
this.tabControl1.MouseClick += tabControl1_MouseClick;

private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
  var tabControl = sender as TabControl;
  var tabs = tabControl.TabPages;

  if (e.Button == MouseButtons.Middle)
  {
    tabs.Remove(tabs.Cast<TabPage>()
            .Where((t, i) => tabControl.GetTabRect(i).Contains(e.Location))
            .First());
  }
}

tabControl1.MouseClick += delegate(object sender, MouseEventArgs e) { var tabControl = sender as TabControl; var tabs = tabControl.TabPages; if (e.Button == MouseButtons.Middle) { tabs.Remove(tabs.Cast<TabPage>().Where((t, i) => tabControl.GetTabRect(i).Contains(e.Location)).First()); } };

6

没有使用LINQ的解决方案不仅不够紧凑美观,而且也是实际的:

private void TabControlMainMouseDown(object sender, MouseEventArgs e)
{
    var tabControl = sender as TabControl;
    TabPage tabPageCurrent = null;
    if (e.Button == MouseButtons.Middle)
    {
        for (var i = 0; i < tabControl.TabCount; i++)
        {
            if (!tabControl.GetTabRect(i).Contains(e.Location))
                continue;
            tabPageCurrent = tabControl.TabPages[i];
            break;
        }
        if (tabPageCurrent != null)
            tabControl.TabPages.Remove(tabPageCurrent);
    }
}

2

没有足够的积分在提供的解决方案中发表评论,但它们都存在同样的缺陷:在移除的选项卡中的控件没有被释放。

敬礼


-1
你可以这样做:
private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
     if (e.Button == MouseButtons.Middle)
     {
          // choose tabpage to delete like below
          tabControl1.TabPages.Remove(tabControl1.TabPages[0]);
     }
}

基本上,您只需捕获选项卡控件上的鼠标单击,并仅在单击中间按钮时删除页面。

2
这不会关闭被点击的选项卡。如果无论我点击哪个选项卡都删除第一个选项卡,那么这会让我发疯。 - Samuel
你可以将它更改为选择想要删除的选项卡。 - ryanulit
@ryanulit,这并没有回答OP的实际问题。当鼠标中键被点击时,OP想要移除光标悬停在其上的TabPage。这只会删除特定的TabPage - 例如,如果用户想要删除 TabPage 2,并且他中键点击了该选项卡,则会删除 TabPage 1,这不是OP所要求的。 - Momoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接