Custom Tooltips in WinForm TreeViews
This is one of those simple coding issues that I was recently faced with that I wish I had a simple example to show me how to knock this out. I had to create a treeview whose nodes were supposed to display a tooltip that could change based on the selected node. Pretty straightforward issue overall, but I ran into a problem: the tooltips weren't working. OK, so it was a big problem with a simple solution. Long story short, there are a few key ingredients in setting tooltips that change based on the node you have selected. My problem stemmed from forgetting to deactivate the tooltip and then reactivate it. I did not see this anywhere in the documentation but I stumbled across it by trying different properties out. Now, maybe this is common knowledge to some or even most of you, but to me it sure wasn't. But I have run into controls in the past that needed to be turned off and on to work properly. So I guess I just chalk this up as one more.
Anyway, here is a short list of things to look for:
- drag a tooltip control onto your designer that has the treeview control
- create a mousemove event handler on the treeview to kick off the tooltip
- check to make sure that a node is selected, or get out
- check to make sure a different node is selected than previously, or get out
- Make the tooltip deactive (tip.Active = false;)
- Set the tooltip text (tip.SetTooltip(tree, toolTipText);
- Make the tooltip active (tip.Active = true;)
Now, I had an object stored in the tag of each treeview node. So I grab it, figure out which obejct I have and get a property of the object to use for the tooltip. This part is up to your implementation of course.
Tooltips
private void tree_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { TreeNode currentNode = tree.GetNodeAt(e.X, e.Y); if ((currentNode == null) || (previousNode == currentNode) || (currentNode.Tag == null)) return; string toolTipText = string.Empty; previousNode = currentNode; object o = previousNode.Tag; if (o is Class1) toolTipText = Class1.Description; else if (o is Class2) toolTipText = Class2.Description; else if (o is Class3) toolTipText = Class3.Description; else toolTipText = string.Empty; // Turn off the tooltip so we can change the text if (tip.Active) tip.Active = false; // Change the tooltip text tip.SetToolTip(tree, toolTipText); // Turn on the tooltip tip.Active = true; }