2009-04-13 9 views

risposta

20

Il codice più breve per eliminare la scheda su cui è stato fatto clic sul pulsante centrale del mouse è utilizzando LINQ.

Assicurarsi che l'evento è cablata
this.tabControl1.MouseClick += tabControl1_MouseClick; 
E per il gestore di 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()); 
    } 
} 
E se si sta cercando per la minor quantità di linee, qui è in una linea
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

Questo è solo un bel codice ... –

+0

Ora stai solo mostrando :) Uomo fantastico, grazie. –

-1

Si potrebbe fare questo:

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

In pratica si sono solo la cattura di un clic del mouse sul controllo scheda e l'eliminazione di una sola pagina, se il tasto centrale è stato cliccato.

+1

Questo non chiuderà la scheda su cui è stato fatto clic. Questo mi farebbe impazzire se eliminasse il primo indipendentemente da quale clic avessi fatto. – Samuel

+0

Beh, lo cambieresti per selezionare la scheda che desideri eliminare. – ryanulit

6

soluzione senza LINQ non così compatto e bello, ma anche attuale:

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 Non ci sono abbastanza punti per pubblicare un commento alle soluzioni fornite, ma tutte hanno lo stesso difetto: i controlli all'interno della scheda rimossa non vengono rilasciati.

Saluti

Problemi correlati