2009-04-13 16 views

Respuesta

20

El código más corto para eliminar la pestaña en la que se hizo clic en el botón central del mouse es mediante LINQ.

Asegúrese de que el evento se cablea
this.tabControl1.MouseClick += tabControl1_MouseClick; 
Y para el manejador en sí
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()); 
    } 
} 
Y si usted se está esforzando para la menor cantidad de líneas, aquí está en una línea
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()); } }; 
+0

Eso es solo un hermoso código ... –

+0

Ahora solo estás presumiendo :) Hombre brillante, gracias. –

-1

Usted puede hacer esto:

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

Básicamente son sólo la captura de un clic del ratón sobre el control de ficha y sólo eliminar una página si se hace clic en el botón central.

+1

Esto no cerrará la pestaña en la que se hizo clic. Esto me volvería loco si eliminara el primero, sin importar en cuál hiciera clic. – Samuel

+0

Bueno, lo cambiarías para seleccionar la pestaña que quisieras eliminar. – ryanulit

6

solución sin LINQ no es tan compacto y hermoso, sino también real:

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 no tiene suficientes puntos para publicar un comentario en las soluciones proporcionadas, pero todos adolecen de la misma falla: los controles dentro de la pestaña eliminada no se liberan.

Saludos

Cuestiones relacionadas