2009-12-17 17 views
0

J'ai conçu le code suivant pour afficher la propriété Tag d'un contrôle au passage de la souris. Le code fonctionne correctement pour les contrôles standard tels que Labels et TextBox, mais je ne peux pas le faire fonctionner pour mes MenuItems (plus précisément ToolStripMenuItems). Pourriez-vous s'il vous plaît jeter un oeil à mon code et me dire ce que j'ai mal fait? Merci d'avance!Définition du texte de la barre d'état dans Hover de la souris - Fonctionne avec les contrôles mais pas les éléments de menu

public void Form1_Load(object sender, EventArgs e) 

{

...

this.addEventsToAllComponents(this);

}

private void addEventsToAllComponents(Component component) 
{ 
    if (component is MenuItem) 
    { 
    MenuItem menuItem = component as MenuItem; 
    menuItem.Select += new EventHandler(menuItem_Select); 
    } 
    else if (component is Control) 
    { 
    Control ctrl = component as Control; 
    foreach (Control control in ctrl.Controls) 
    { 
     control.MouseEnter += new EventHandler(this.control_MouseEnter); 
     control.MouseLeave += new EventHandler(this.control_MouseLeave); 
     if (control.HasChildren) 
     addEventsToAllComponents(control); 
    } 
    } 
} 

    private void menuItem_Select(object sender, EventArgs e) 
{ 
    MenuItem menuItem = sender as MenuItem; 

    if (menuItem.Tag.ToString().Length > 0) 
    this.toolStripStatusLabel1.Text = menuItem.Tag.ToString(); 
} 

private void control_MouseEnter(object sender, EventArgs e) 
{ 
    Control control = sender as Control; 

    if (control.Tag.ToString().Length > 0) 
    this.toolStripStatusLabel1.Text = control.Tag.ToString(); 
} 

private void control_MouseLeave(object sender, EventArgs e) 
{ 
    if (this.toolStripStatusLabel1.Text.ToString().Length > 0) 
    this.toolStripStatusLabel1.Text = ""; 
} 

Répondre

0

Il y a quelques problèmes avec votre code.

1er. Les éléments d'un MenuStrip ne sont pas des enfants de l'élément, donc HasChildren retournera false. Au lieu de cela, ils sont dans la collection Items du MenuStrip. Vous devez gérer une occurrence de MenuStrip spécialement. Ajoutez le code suivant dans votre addEvents ... méthode ci-dessous:

(snip...) 
// old code      
if (control.HasChildren) 
    AddEventsToAllControls(control); 
//add new code below 
if (control is MenuStrip) { 
    MenuStrip ms = control as MenuStrip; 
    AddEventsToAllToolStripMenuitems(ms.Items); 
} 

et ajoutez la nouvelle méthode comme suit:

private void AddEventsToAllToolStripMenuitems (ToolStripItemCollection items) { 
    foreach (ToolStripItem tsi in items) { 
     tsi.MouseEnter += new EventHandler(this.control_MouseEnter); 
     tsi.MouseLeave += new EventHandler(this.control_MouseLeave); 
     if (tsi is ToolStripMenuItem) { 
      ToolStripMenuItem mi = tsi as ToolStripMenuItem; 
      AddEventsToAllToolStripMenuitems(mi.DropDownItems); 
     } 
    } 
} 

2. ToolStripItem ne dérive pas de Control, donc dans MouseEnter, l'instruction expéditeur comme commande échouera (le contrôle sera nul). Faites quelque chose comme ceci:

Control control = sender as Control; 
if (control != null && control.Tag != null && control.Tag.ToString().Length > 0) 
    this.toolStripStatusLabel1.Text = control.Tag.ToString(); 

ToolStripItem tsi = sender as ToolStripItem; 
if (tsi != null && tsi.Tag != null && tsi.Tag.ToString().Length > 0) 
    this.toolStripStatusLabel1.Text = tsi.Tag.ToString(); 

(j'ai aussi ajouté quelques contrôles null)

Cela devrait vous aller.

+0

Merci M-Peror! Cela a fait l'affaire. Tu es le (wo) homme !!! Je suppose que j'ai encore beaucoup à apprendre en ce qui concerne VS08, C# et WinForms. Je –

+0

dû ajouter ce qui suit à votre code: "else if (contrôle est ToolStrip) { ToolStrip ts = commande ToolStrip; AddEventsToAllToolStripItems (ts.Items);} ". –

0

Vous n'avez pas du code pour gérer ToolStripMenuItems - Ils ne sont pas dérivés MenuItems, donc votre code de gestion de MenuItem ne fera rien pour eux. A côté: pour des raisons de lisibilité, vous pouvez utiliser string.IsNullOrEmpty(menuItem.Tag.ToString()) pour tester les chaînes vide/vide.

+0

Merci pour les suggestions; Je vais travailler un peu plus sur le code et voir si je peux le faire fonctionner correctement. Je ne connaissais pas IsNullOrEmpty car je suis nouveau à C# mais pas de programmation en général. Je vais l'utiliser à l'avenir à partir de maintenant. –

+0

Modifier le MenuItem à ToolStripMenuItem n'a pas résolu le problème. D'autres suggestions? –

0

Vous n'avez pas configuré la récursivité pour MenuItems qui contient d'autres éléments de menu. Donc quand il trouvera un menuitem, il ajoutera seulement le niveau supérieur MenuItem, pas ses enfants.

essayer d'ajouter:

foreach (MenuItem item in menuItem.MenuItems) 
{ 
    item Select += new EventHandler(menuItem_Select); 
    if (item.IsParent) 
    addEventsToAllComponents(item); 
} 

dans la section pour la manipulation MenuItems.

+0

Merci pour le conseil.Je n'ai pas utilisé la récursivité pour les MenuItems car je ne me suis pas rendu compte que les MenuItems sont imbriqués mais je vais élaborer le code pour cela. –

+0

Apparemment, il n'y a aucun isParent ou HasChildren pour ToolStripMenuItems. –

+1

Pour ToolStripMenuItems, utilisez: foreach (élément ToolStripMenuItem dans menuItem.DropDownItems). Pour tester "IsParent", utilisez (menuItem.DropDownItems.Count> 0) –

0

Voici le code révisé méthode AddEventsToAllComponents:

private void addEventsToAllControls(Control ctrl) 
{ 
    foreach (Control control in ctrl.Controls) 
    { 
    control.MouseEnter += new EventHandler(this.control_MouseEnter); 
    control.MouseLeave += new EventHandler(this.control_MouseLeave); 
    if (control.HasChildren) 
     addEventsToAllControls(control); 

    if (control is MenuStrip) 
    { 
     MenuStrip ms = control as MenuStrip; 
     AddEventsToAllToolStripItems(ms.Items); 
    } 
    else if (control is ToolStrip) 
    { 
     ToolStrip ts = control as ToolStrip; 
     AddEventsToAllToolStripItems(ts.Items); 
    } 
    } 
}