2009-07-22 10 views
12

Je suis en train d'ajouter une info-bulle à une étiquette comme ceci:Comment supprimer une info-bulle liée à un contrôle?

ToolTip LabelToolTip = new System.Windows.Forms.ToolTip(); 
LabelToolTip.SetToolTip(this.LocationLabel, text); 

Quand je dois changer cette info-bulle que les modifications apportées au texte de l'étiquette, j'essayer de faire la même chose pour ajouter une nouvelle info-bulle. Malheureusement, l'ancienne info-bulle reste sous la nouvelle, ce qui est vraiment ennuyeux. Existe-t-il une méthode pour supprimer l'ancienne info-bulle, ou devrais-je simplement créer une nouvelle étiquette lorsque je veux changer le texte d'une étiquette?

Répondre

15

Créez une instance unique du ToolTip et utilisez-la lorsque vous souhaitez l'afficher à l'aide de la méthode SetToolTip et utilisez la méthode Hide pour la masquer. Généralement, il n'est pas nécessaire de créer plus d'une instance ToolTip.

+2

Ah, donc je devrais avoir une variable d'instance de classe tenant un objet au lieu infobulle et réutiliser quand il a besoin d'être changé. Merci beaucoup. – benmatth

4
public class ToolTipHelper 
{ 
    private readonly Dictionary<string, ToolTip> tooltips; 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    public ToolTipHelper() 
    { 
     this.tooltips = new Dictionary<string, ToolTip>(); 
    } 

    /// <summary> 
    /// Key a tooltip by its control name 
    /// </summary> 
    /// <param name="controlName"></param> 
    /// <returns></returns> 
    public ToolTip GetControlToolTip(string controlName) 
    { 
     if (tooltips.ContainsKey(controlName)) 
     { 
      return tooltips[controlName]; 
     } 
     else 
     { 
      ToolTip tt = new ToolTip(); 
      tooltips.Add(controlName, tt); 
      return tt; 
     } 
    } 
} 

Utilisation:

var tt = toolTips.GetControlToolTip("button1"); 
tt.SetToolTip(button1, "This is my button1 tooltip"); 
tt = toolTips.GetControlToolTip("button2"); 
tt.SetToolTip(button2, "This is my button2 tooltip"); 
5

J'ai modifié le code de Gavin Stevens pour faire tout statique comme ceci:

class ToolTipHelper 
{ 
    private static readonly Dictionary<string, ToolTip> tooltips = new Dictionary<string, ToolTip>(); 

    public static ToolTip GetControlToolTip(string controlName) 
    { 
     <same as above> 
    } 
} 

Maintenant, vous n'avez plus à instancier un ToolTipHelper (par conséquent, il n'a pas besoin de constructeur), et donc vous pouvez maintenant accéder à ce de n'importe quelle classe comme:

ToolTip tt = ToolTipHelper.GetControlToolTip("button1"); 
tt.SetToolTip(button1, "This is my button1 tooltip"); 

Aussi utile avec l'une ou l'autre version est d'activer et de désactiver une info-bulle, vous pouvez simplement définir tt.Active vrai ou faux.

modifier

encore amélioré sur ce point:

class ToolTipHelper 
{ 
    private static readonly Dictionary<string, ToolTip> tooltips = new Dictionary<string, ToolTip>(); 
    public static ToolTip GetControlToolTip(string controlName) 
    { 
     <same as above still> 
    } 
    public static ToolTip GetControlToolTip(Control control) 
    { 
     return GetControlToolTip(control.Name); 
    } 
    public static void SetToolTip(Control control, string text) 
    { 
     ToolTip tt = GetControlToolTip(control); 
     tt.SetToolTip(control, text); 
    } 
} 

Alors maintenant, la fixation d'un info-bulle de partout dans le programme est une seule ligne:

ToolTipHelper.SetToolTip(button1, "This is my button1 tooltip"); 

Si vous n » Vous n'avez pas besoin d'accéder aux anciennes fonctions, vous pouvez les combiner et/ou les rendre privées. Le SetToolTip() est le seul que vous ayez jamais utilisé. e.

+0

Je suppose que Gavin Stevens mérite le crédit, mais j'aime la solution statique. Sans entrer dans trop de détails, j'ai eu une forme très compliquée avec des centaines de contrôles qui avaient des tooltips assignés à chaque soumission de formulaire et donc vous ne pourriez jamais tuer les anciens. Cette solution m'a sauvé de maux de tête considérables. – 333Matt

+0

Oui, c'est mieux! –

3

Pour retirer simplement l'info-bulle du contrôle, vous pouvez modifier la classe comme ceci:

public static void SetToolTip(Control control, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
     { 
      if (tooltips.ContainsKey(control.Name)) 
      { 
       GetControlToolTip(control).RemoveAll(); 
       tooltips.Remove(control.Name); 
      } 
     } 
     else 
     { 
      ToolTip tt = GetControlToolTip(control); 
      tt.SetToolTip(control, text); 
     } 
    } 

et utilisez cette commande:

ToolTipHelper.SetToolTip(control, "") 
0

L'objet infobulle fonctionne dans plusieurs contrôles à la temps.

Créez une instance unique de l'info-bulle et utilisez-la pour ajouter et supprimer une info-bulle de tout contrôle.

Lors de l'ajout, vous devez simplement utiliser .SetToolTip (Control, "un message qui apear quand vol stationnaire") Lorsque vous retirez vous définissez juste revenir à null avec .SetToolTip (contrôle, null).

+0

Si vous souhaitez citer une source, vous devez attribuer cette source à votre publication. – LarsTech

Questions connexes