Hi,
I'm using a custom node to display a button for some of the nodes in my treeview. The custom node consists of just a textElement and a buttonElement, they are placed in a StackLayoutElement.
When updating the nodes text property in the editor it afterwards appears two times. See the attached file(to make it more it clear I've set textElement.StretchVertically = false so that it can clearly be seen). It's like both the node text and the virtual text element is visible. Pointers to how I resolve this would be much appreciated :D.
/Thomas
4 Answers, 1 is accepted
Thank you for writing.
Depending on the TreeViewElement.EditMode, when editing a certain node either the RadTreeNode.Text or RadTreeNode.Value will be updated. In order to avoid duplicate text when using custom nodes, you should set the TreeNodeContentElement.Text property to empty string in the TreeNodeContentElement.Synchronize method. Here is a sample code snippet:
public Form1(){ InitializeComponent(); this.radTreeView1.CreateNodeElement += radTreeView1_CreateNodeElement; for (int i = 0; i < 5; i++) { RadTreeNode node = new RadTreeNode(); node.Text = "Parent" + i; for (int j = 0; j < 3; j++) { RadTreeNode childNode = new RadTreeNode(); childNode.Text = "Child" + i; node.Nodes.Add(childNode); } this.radTreeView1.Nodes.Add(node); } this.radTreeView1.ExpandAll(); this.radTreeView1.AllowEdit = true; this.radTreeView1.TreeViewElement.EditMode = TreeNodeEditMode.Text;}private void radTreeView1_CreateNodeElement(object sender, Telerik.WinControls.UI.CreateTreeNodeElementEventArgs e){ if (e.Node.Level > 0) { e.NodeElement = new ChildTreeNodeElement(); } else { e.NodeElement = new ParentTreeNodeElement(); }}public class ParentTreeNodeElement : TreeNodeElement{ protected override TreeNodeContentElement CreateContentElement() { return new TreeNodeContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } public override bool IsCompatible(RadTreeNode data, object context) { return data.Level == 0; }}public class ChildTreeNodeElement : TreeNodeElement{ protected override TreeNodeContentElement CreateContentElement() { return new ChildContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } public override bool IsCompatible(RadTreeNode data, object context) { return data.Level > 1; }}class ChildContentElement : TreeNodeContentElement{ StackLayoutElement nodeContentContainer; LightVisualElement textElement; RadButtonElement buttonElement; protected override Type ThemeEffectiveType { get { return typeof(TreeNodeContentElement); } } public override void Synchronize() { TreeNodeElement treeNodeElement = this.NodeElement; RadTreeNode node = treeNodeElement.Data; this.buttonElement.Text = node.Text; this.textElement.Text = node.Text; this.Text = string.Empty; } protected override void CreateChildElements() { nodeContentContainer = new StackLayoutElement(); nodeContentContainer.Orientation = Orientation.Horizontal; nodeContentContainer.StretchHorizontally = true; nodeContentContainer.StretchVertically = false; textElement = new LightVisualElement(); textElement.ShouldHandleMouseInput = false; textElement.NotifyParentOnMouseInput = true; textElement.StretchVertically = false; this.nodeContentContainer.Children.Add(textElement); buttonElement = new RadButtonElement(); buttonElement.Click += buttonElement_Click; buttonElement.StretchVertically = false; this.nodeContentContainer.Children.Add(buttonElement); this.Children.Add(nodeContentContainer); } private void buttonElement_Click(object sender, EventArgs e) { RadMessageBox.Show("Clicked"); }}I hope this information helps. Should you have further questions, I would be glad to help.
Dess
Telerik
See What's Next in App Development. Register for TelerikNEXT.
Hi again,
In the provided example when clicking the button on an already selected node, the node enters edit mode. How can that be avoided?
I've tried with
buttonElement.NotifyParentOnMouseInput = false;
Any help would be much appreciated.
/Thomas
Thank you for writing back.
In order to avoid entering edit mode when it is not necessary according to your requirement, you can use the RadTreeView.Editing event and cancel it by setting the TreeNodeEditingEventArgs.Cancel argument to true.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik
See What's Next in App Development. Register for TelerikNEXT.
