Salut, j'affiche un tooltip quand l'utilisateur passe la souris au dessus d'un node d'un treeview. Le tooltip s'affiche correctement, sauf qu'il clignote. Comment je peux empécher ce phénomène???
Salut, j'affiche un tooltip quand l'utilisateur passe la souris au dessus d'un node d'un treeview. Le tooltip s'affiche correctement, sauf qu'il clignote. Comment je peux empécher ce phénomène???
Je travaille sur une winform.
Mon code est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public void treeviewClients_MouseMove(object sender, MouseEventArgs e) { TreeNode theNode = this.treeviewClients.GetNodeAt(e.X, e.Y); this.InfoBulle.IsBalloon = true; this.InfoBulle.InitialDelay = 1000; this.InfoBulle.AutoPopDelay = 5000; this.InfoBulle.ReshowDelay = 500; this.InfoBulle.ToolTipTitle = "Client:"; // Définir une info-bulle uniquement si le pointeur de la souris est en fait placé sur le noeud. if ((theNode != null)) { // Vérifier que la propriété Tag n'est pas "null". if (theNode.Tag != null) { string texte = ""; try { //On met en place la connexion ConnectionMysql Bd = new ConnectionMysql(); MySqlConnection Conn = Bd.Connexion(); // Ici, on ouvre la connexion au serveur Conn.Open(); //Création de la commande MySqlCommand MaSqlCmd = new MySqlCommand(); MaSqlCmd.Connection = Conn; //Connexion à la base de données String Sql = "SELECT NomClient, PrenomClient FROM clients WHERE NumSecuriteSociale = " + theNode.Tag.ToString() + ";"; // On execute la requete MaSqlCmd.CommandText = Sql; //Récupération de la commande MySqlDataReader monSqlDR = MaSqlCmd.ExecuteReader(); //Execution de la commande while (monSqlDR.Read()) { texte = monSqlDR.GetValue(0).ToString() + " " + monSqlDR.GetValue(1).ToString(); } Conn.Close(); } catch (MySqlException error) { MessageBox.Show("Problème lors de la création des informations de l'infobulle : " + error); } // Modifier l'info-bulle uniquement si le pointeur a été déplacé vers un nouveau noeud. if (theNode.Tag.ToString() != this.InfoBulle.GetToolTip(this.treeviewClients)) { this.InfoBulle.SetToolTip(this.treeviewClients, texte); } } else { this.InfoBulle.SetToolTip(this.treeviewClients, ""); } } else // Le pointeur n'est pas placé sur un noeud. Effacer l'info-bulle. { this.InfoBulle.SetToolTip(this.treeviewClients, ""); } }
Oulalalalala !
Tu fais une requète en base dans un MouseMove ?
Tu sais combien de fois cette fonction est appelée quand tu déplaces ta souris sur ton Treeview ? Pas très étonnant que ça clignote...
Franchement, c'est bien moins lourd pour ta machine de faire une requète pour tous les noeuds visibles, de les stocker dans une table, et de modifier les tooltips que quand c'est nécessaire.
Ensuite, pourquoi ne pas initialiser une seule fois les paramètres de ton InfoBulle, plutôt que de le faire à chaque déplacement de souris ?
Sinon le reste est ok.
Ah oui... Je n'avais pas pensé à ca... Effectivement ca doit être lourd.Envoyé par Mose
Le truc, c'est que je veux afficher une liste de clients dans une arborescence. Je dispose également d'une textbox que l'utilisateur peut utilisée pour afficher les clients dont le nom commence par les lettres qui sont rentrées dans la textbox. Il faut donc réinitialiser l'arborescence à chaque fois. Mais ca serait le cas avec une table non?
De toute facon, il me suffit de remplir le champ tag (que j'affiche dans le tooltip) complétement au moment de la création de l'arborescence, et je pourrais déja enlever les requètes de la fonction mouseMove.
Car les informations que je met dans le tooltip change en fonction du node survolé.Envoyé par Mose
TrèsEnvoyé par boss_gama
Effectivement, quand tu réinitialise le contenu de ton TreeView, il faut réinitialiser la "table des tooltips" (j'ai dit table comme j'aurais pu dire liste ou tableau).Envoyé par boss_gama
Maintenant si ton champs Tag est libre, pas besoin de cette table, autant l'utiliser.Je parlais de l'initialization, pas du texte.Envoyé par boss_gama
A savoir le code suivant :Ce code là étant identique partout, je ne comprend pas pourquoi tu ré-exécute ce code à chaque appel de MouseMove.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 this.InfoBulle.IsBalloon = true; this.InfoBulle.InitialDelay = 1000; this.InfoBulle.AutoPopDelay = 5000; this.InfoBulle.ReshowDelay = 500; this.InfoBulle.ToolTipTitle = "Client:";
Une fois au début suffit
Partager