2009-04-13 9 views

Répondre

20

Le code le plus court pour supprimer l'onglet sur lequel le bouton du milieu de la souris a été cliqué est en utilisant LINQ.

Assurez-vous que l'événement est câblé
this.tabControl1.MouseClick += tabControl1_MouseClick; 
Et pour le gestionnaire lui-même
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()); 
    } 
} 
Et si vous efforcez moins de lignes, ici il est dans une ligne
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

C'est juste beau code ... –

+0

Maintenant, vous êtes juste en train de montrer :) Brillant homme, merci. –

-1

Vous pouvez le faire:

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

Fondamentalement, vous êtes juste attraper un clic de souris sur le contrôle onglet et ne supprimer une page si le bouton du milieu a été cliqué.

+1

Ceci ne fermera pas l'onglet sur lequel vous avez cliqué. Cela me rendrait fou s'il supprimait le premier, peu importe celui sur lequel j'ai cliqué. – Samuel

+0

Eh bien, vous le changer pour sélectionner l'onglet que vous voulez vous débarrasser. – ryanulit

6

Solution sans LINQ pas si compact et beau, mais aussi réel:

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 Il n'y a pas assez de points pour poster un commentaire sur les solutions fournies, mais ils souffrent tous de la même faille: Les contrôles dans l'onglet supprimé ne sont pas libérés.

Cordialement

Questions connexes