2009-04-13 77 views

回答

20

删除中间鼠标按钮被点击的标签的最短代码是通过使用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()); } }; 
-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]); 
    } 
} 

基本上你只是迎头赶上标签控制鼠标点击仅删除页面,如果被点击中间的按钮。

+1

这将不会关闭被点击的标签页。这会让我疯狂,如果它删除了第一个,不管我点击了哪一个。 – Samuel 2009-04-13 20:50:57

+0

那么你会改变它来选择你想要摆脱的任何标签。 – ryanulit 2009-04-14 14:00:24

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

D没有足够的分数来发表对所提供的解决方案的评论,但他们都遭受同样的缺陷:已删除选项卡中的控件未被释放。

Regards