Download CustomTreeViewLabelEdit.zip, last updated 28/10/2013 (16.32 KB)

Download
  • md5: 80ba715b3ff9cc64851d7914f54af397
using System;
using System.Windows.Forms;

namespace CustomTreeViewLabelEdit
{
  internal partial class MainForm : Form
  {
    // Specifying custom text when using the LabelEdit functionality of a TreeView
    // http://cyotek.com/blog/specifying-custom-text-when-using-the-labeledit-functionality-of-a-treeview

    #region Constructors

    public MainForm()
    {
      InitializeComponent();
    }

    #endregion

    #region Overridden Members

    protected override void OnLoad(EventArgs e)
    {
      base.OnLoad(e);

      this.FillTree(normalTreeView);
      this.FillTree(subclassedTreeView);
      this.FillTree(notifyTreeView);
    }

    #endregion

    #region Members

    private void FillTree(TreeView treeView)
    {
      TreeNode root;
      Random random;

      random = new Random();

      treeView.BeginUpdate();

      root = new TreeNode
      {
        Name = "alpha",
        Text = "Alpha",
      };

      foreach (string name in new[]
      {
        "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu", "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi", "Chi", "Psi", "Omega"
      })
      {
        string value;
        int imageIndex;

        imageIndex = random.Next(0, imageList.Images.Count);
        value = name.GetHashCode().ToString("X2");

        root.Nodes.Add(new TreeNode
        {
          Text = string.Format("{0}: {1}", name, value),
          Name = name,
          Tag = value,
          ImageIndex = imageIndex,
          SelectedImageIndex = imageIndex
        });
      }

      treeView.Nodes.Add(root);
      root.Expand();

      treeView.EndUpdate();
    }

    #endregion

    #region Event Handlers

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
      this.Close();
    }

    private void normalTreeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
    {
      // e.Label = e.Node.Name; - Readonly. Useless.

      // e.Node.Text = e.Node.Name; - This will change the node text (meaning 
      // you have to store it somewhere so you can revert the change), but
      // won't change the text inside the edit field. Also useless.
    }

    private void normalTreeView_KeyDown(object sender, KeyEventArgs e)
    {
      TreeNode node;

      base.OnKeyDown(e);

      node = normalTreeView.SelectedNode;
      if (e.KeyCode == Keys.F2 && normalTreeView.LabelEdit && node != null && !node.IsEditing)
        node.BeginEdit();
    }

    private void notifyTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
    {
      if (e.Label != null)
      {
        e.CancelEdit = true;

        e.Node.Name = e.Label;
        e.Node.Text = string.Format("{0}: {1}", e.Label, e.Node.Tag);
      }
    }

    private void notifyTreeView_RequestEditText(object sender, NodeRequestTextEventArgs e)
    {
      e.Label = e.Node.Name;
    }

    private void renameToolStripMenuItem_Click(object sender, EventArgs e)
    {
      TreeView treeView;
      Control focusedChild;

      focusedChild = this.ActiveControl;
      treeView = null;

      while (focusedChild != null && treeView == null)
      {
        treeView = focusedChild as TreeView;

        if (focusedChild is SplitContainer)
          focusedChild = ((SplitContainer)focusedChild).ActiveControl;
      }

      if (treeView != null && treeView.SelectedNode != null)
        treeView.SelectedNode.BeginEdit();
    }

    private void subclassedTreeView_RequestDisplayText(object sender, NodeRequestTextEventArgs e)
    {
      e.Node.Name = e.Label;
      e.Label = string.Format("{0}: {1}", e.Label, e.Node.Tag);
    }

    private void subclassedTreeView_RequestEditText(object sender, NodeRequestTextEventArgs e)
    {
      e.Label = e.Node.Name;
    }

    #endregion
  }
}

Donate

Donate