Hi,
I have a TreeView in one form. I have used the DrawNode event to
create two columns in the TreeView. Source code, which is taken from
microsoft msdn site, used is given below:
private void tvwCOA_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
int intFlag = 0;
// Draw the background and node text for a selected node.
if ((e.State & TreeNodeStates.Selected) != 0)
{
// Draw the background of the selected node. The NodeBounds
// method makes the highlight rectangle large enough to
// include the text of a node tag, if one is present.
e.Graphics.FillRectangle(Brushes.Green, NodeBounds(e.Node));
// Retrieve the node font. If the node font has not been set,
// use the TreeView font.
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
// Draw the node text.
e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, e.Bounds.X, e.Bounds.Y);
e.Graphics.DrawString(clsCommon.Right(e.Node.Tag.ToString(), 8), nodeFont, Brushes.White, 435, e.Bounds.Y);
intFlag = 1;
}
// Use the default background and node text.
else
{
e.DrawDefault = true;
}
// If a node tag is present, draw its string representation
// to the right of the label text.
if (intFlag != 1)
{
e.Graphics.DrawString(clsCommon.Right(e.Node.Tag.ToString(), 8), tagFont, Brushes.Black, 435, e.Bounds.Top);
}
// If the node has focus, draw the focus rectangle large, making
// it large enough to include the text of the node tag, if present.
if ((e.State & TreeNodeStates.Focused) != 0)
{
using (Pen focusPen = new Pen(Color.Black))
{
focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Rectangle focusBounds = NodeBounds(e.Node);
focusBounds.Size = new Size(focusBounds.Width - 1,
focusBounds.Height - 1);
e.Graphics.DrawRectangle(focusPen, focusBounds);
}
}
}
private Rectangle NodeBounds(TreeNode node)
{
// Set the return value to the normal node bounds.
Rectangle bounds = node.Bounds;
if (node.Tag != null)
{
// Retrieve a Graphics object from the TreeView handle
// and use it to calculate the display width of the tag.
Graphics g = tvwCOA.CreateGraphics();
//int tagWidth = (int)g.MeasureString (node.Tag.ToString(), tagFont).Width + 6;
int tagWidth = 485; // (int)g.MeasureString(node.Text.ToString(), tagFont).Width + 6;
// Adjust the node bounds using the calculated value.
bounds.Offset(tagWidth / 2, 0);
bounds = Rectangle.Inflate(bounds, tagWidth / 2, 0);
g.Dispose();
}
return bounds;
}
Each node has a value in the tag. The problem I am facing is
whenever I click a node to expand it, the tag value of the first node
in the TreeView ( which is printed against the first node at X= 435 ) is
overwritten by the tag value of the first
child of the expanded node. If we scroll down and come to the first
node the value is correct. I tried a lot but could not locate where I am
making a mistake. Hope I explained well. Please help.
Cris Evan