【问题标题】:Close tab on winforms tab control with middle mouse button使用鼠标中键关闭 winforms 选项卡控件上的选项卡
【发布时间】:2009-04-13 20:21:46
【问题描述】:

有没有简单(5 行代码)的方法来做到这一点?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    删除单击鼠标中键的选项卡的最短代码是使用 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()); } };
    

    【讨论】:

      【解决方案2】:

      没有 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);
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        问候

        【讨论】:

          【解决方案4】:

          你可以这样做:

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

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

          【讨论】:

          • 这不会关闭被点击的标签。如果它删除了第一个,无论我点击哪个,这都会让我发疯。
          • 嗯,你可以改变它来选择你想摆脱的任何标签。
          • @ryanulit ,这不是回答 OP 的 实际问题。 当单击鼠标中键时,OP 想要删除光标悬停在上面的 TabPage .这只会删除特定的TabPage - 例如如果用户想要删除 TabPage 2,并且他中键单击标签,它将删除 TabPage 1,这是不是 OP 要求什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多