Click here to Skip to main content
15,905,508 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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
Posted
Updated 7-Nov-10 21:07pm
v2

1 solution

I think the problem might be you are doing some drawing even if the else was executed -> e.DrawDefault = true;. This means that when you're handler is done, the value of DrawDefault is used to determine if any drawing must be done.

This code is outside of that logic and could be repainted by the default handler:
C#
// 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);
    }
  }
}


Good luck!
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900