Hi Guys
I recently added a radiobutton element to the standard RadComboBoxItem by overriding the CreateChildElements() method on the control.
I was wondering if there was an override on the RadTreeNode which I could use to disable the checkbox which displays on a Node. I want the user to be able to see the checked state without being able to change it? Could I add a method to an inherited node which would allow me to use code like this.
RadCustomTreeNode.Checkbox.Enabled = false;"
Many thanks in advance
Regards
Ian Carson
I recently added a radiobutton element to the standard RadComboBoxItem by overriding the CreateChildElements() method on the control.
I was wondering if there was an override on the RadTreeNode which I could use to disable the checkbox which displays on a Node. I want the user to be able to see the checked state without being able to change it? Could I add a method to an inherited node which would allow me to use code like this.
RadCustomTreeNode.Checkbox.Enabled = false;"
Many thanks in advance
Regards
Ian Carson
24 Answers, 1 is accepted
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 25 Mar 2011, 11:00 AM
Hello,
In Q1 2011 the RadTreeView has been given a major overhaul and now uses the TPF which means it is fully customizable. Just like the RadGridView's well known CellFormatting event, you can perform similar operations in the RadTreeView.
The new RadTreeView contains a NodeFormatting event where you can perform this functionality. For exmaple
I hope this helps but let me know if you have further questions
Richard
In Q1 2011 the RadTreeView has been given a major overhaul and now uses the TPF which means it is fully customizable. Just like the RadGridView's well known CellFormatting event, you can perform similar operations in the RadTreeView.
The new RadTreeView contains a NodeFormatting event where you can perform this functionality. For exmaple
private void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e) { ((TreeNodeCheckBoxElement)e.NodeElement.Children[2]).Enabled = false; }I hope this helps but let me know if you have further questions
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 28 Mar 2011, 09:34 AM
Hello,
Did this help? If so, please remember to mark as answer. If you need further assistance though, do just let me know.
Thanks
Richard
Did this help? If so, please remember to mark as answer. If you need further assistance though, do just let me know.
Thanks
Richard
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 12:43 AM
Hi Richard,
This was exactly what I needed thanks.
Now I'm having a go at adding a second checkbox to the treenode. Any hints as to the best way to do this?
Regards
Ian
This was exactly what I needed thanks.
Now I'm having a go at adding a second checkbox to the treenode. Any hints as to the best way to do this?
Regards
Ian
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 03:26 AM
Hi Richard
This what I have so far. The code below gets a checkbox onto the node at the beginning of the text element of each node but it overwrites the Text element. I have attached a screenshot of the outcome as well.
Can you see where I am going awry?
Called the CreateNodeElement event on the treeview
This is the RadCustomTreeNodeElementWithExtraCheckBox Class
This what I have so far. The code below gets a checkbox onto the node at the beginning of the text element of each node but it overwrites the Text element. I have attached a screenshot of the outcome as well.
Can you see where I am going awry?
Called the CreateNodeElement event on the treeview
void TreeViewElement_CreateNodeElement(object sender, CreateTreeNodeElementEventArgs e) { e.NodeElement = new RadCustomTreeNodeElementWithExtraCheckBox(); }This is the RadCustomTreeNodeElementWithExtraCheckBox Class
public class RadCustomTreeNodeElementWithExtraCheckBox: TreeNodeElement { protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; } protected override TreeNodeContentElement CreateContentElement() { return new RadCustomContentElement(); } protected override Type ThemeEffectiveType { get {return typeof(TreeNodeElement);} } } And this is the RadCustomContentElement class
public class RadCustomContentElement:TreeNodeContentElement { TreeNodeCheckBoxElement chkBox2; TreeNodeElement treenodeElement; protected override Type ThemeEffectiveType { get {return typeof(TreeNodeContentElement);} } protected override void InitializeFields() { base.InitializeFields(); } public override void Synchronize() { base.Synchronize(); treenodeElement = this.NodeElement; RadTreeNode node = treenodeElement.Data; } protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.Margin = new Padding(0, 0, 5, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; base.Children.Add(chkBox2); } }
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 08:07 AM
Hi Again Richard
Due to the time difference between Australia and Boston I continue to make progress while you sleep!
I realised I was creating the checkbox in the Content element and have now corrected this so that the RadCustomTreeNodeElementWithExtraCheckBox Class now creates the checkbox element inside the treeNode Element as follows:
You'll notice from the above that I'm now struggling with the positioning of the checkbox in the treenode stack . I want it to be the first item in the node but the separation between the new checkbox and the rest of the node is now too large. It looks like the treeview has been set right-to-left but I have done nothing deliberate to make this happen. See attached file.
I also need to know how I trap the new node's "CheckChanged" event as an event on the node so that when the new checkbox is checked/unchecked I have something like a second "NodeCheckChanged" event to use on the node
All help gratefully received! :-)
Thanks in advance
Regards
Ian
Due to the time difference between Australia and Boston I continue to make progress while you sleep!
I realised I was creating the checkbox in the Content element and have now corrected this so that the RadCustomTreeNodeElementWithExtraCheckBox Class now creates the checkbox element inside the treeNode Element as follows:
public class RadCustomTreeNodeElementWithExtraCheckBox: TreeNodeElement { TreeNodeCheckBoxElement chkBox2; protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; } protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.ToggleStateChanged += new StateChangedEventHandler(chkBox2_ToggleStateChanged); chkBox2.Click += new EventHandler(chkBox2_Click); //chkBox2.Margin = new Padding(0, 0, 5, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; Children.Insert(1, chkBox2); } void chkBox2_Click(object sender, EventArgs e) { throw new NotImplementedException(); } void chkBox2_ToggleStateChanged(object sender, StateChangedEventArgs args) { throw new NotImplementedException(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } }You'll notice from the above that I'm now struggling with the positioning of the checkbox in the treenode stack . I want it to be the first item in the node but the separation between the new checkbox and the rest of the node is now too large. It looks like the treeview has been set right-to-left but I have done nothing deliberate to make this happen. See attached file.
I also need to know how I trap the new node's "CheckChanged" event as an event on the node so that when the new checkbox is checked/unchecked I have something like a second "NodeCheckChanged" event to use on the node
All help gratefully received! :-)
Thanks in advance
Regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 29 Mar 2011, 11:09 AM
Hi Ian,
I'll see if I can prepare a sample for you as soon as I can. Hope it will be today.
Regards,
Richard
I'll see if I can prepare a sample for you as soon as I can. Hope it will be today.
Regards,
Richard
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 11:11 AM
Hi Richard
That would be brilliant.
Thanks mate
regards
Ian
That would be brilliant.
Thanks mate
regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 29 Mar 2011, 12:14 PM
Hi Ian,
I think this will get you started.
From my understanding so far of thew new RadTreeView, you will need to create the additional checkbox as content. The node content will contain the checkbox and a new text element (I hide the node text, so we can display the context correctly). If you want the additional checkbox to be the first one, then you'd need to create two checkbox elements in the context and hide the original node checkbox.
At the moment though, I've turned on standard checkboxes and created one additional checkbox and textelement which should guide you in the right direction.
Designer File
Form1.cs
Hope that helps
Richard
I think this will get you started.
From my understanding so far of thew new RadTreeView, you will need to create the additional checkbox as content. The node content will contain the checkbox and a new text element (I hide the node text, so we can display the context correctly). If you want the additional checkbox to be the first one, then you'd need to create two checkbox elements in the context and hide the original node checkbox.
At the moment though, I've turned on standard checkboxes and created one additional checkbox and textelement which should guide you in the right direction.
Designer File
namespace RadControlsWinFormsApp1 { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.radTreeView1 = new Telerik.WinControls.UI.RadTreeView(); ((System.ComponentModel.ISupportInitialize)(this.radTreeView1)).BeginInit(); this.SuspendLayout(); // // radTreeView1 // this.radTreeView1.BackColor = System.Drawing.SystemColors.Control; this.radTreeView1.Cursor = System.Windows.Forms.Cursors.Default; this.radTreeView1.Dock = System.Windows.Forms.DockStyle.Fill; this.radTreeView1.Font = new System.Drawing.Font("Segoe UI", 8.25F); this.radTreeView1.ForeColor = System.Drawing.Color.Black; this.radTreeView1.Location = new System.Drawing.Point(0, 0); this.radTreeView1.Name = "radTreeView1"; this.radTreeView1.RightToLeft = System.Windows.Forms.RightToLeft.No; // // // this.radTreeView1.RootElement.ForeColor = System.Drawing.Color.Black; this.radTreeView1.Size = new System.Drawing.Size(359, 342); this.radTreeView1.TabIndex = 0; this.radTreeView1.Text = "radTreeView1"; this.radTreeView1.NodeCheckedChanged += new Telerik.WinControls.UI.RadTreeView.TreeViewEventHandler(this.radTreeView1_NodeCheckedChanged); this.radTreeView1.CreateNodeElement += new Telerik.WinControls.UI.CreateTreeNodeElementEventHandler(this.radTreeView1_CreateNodeElement); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(359, 342); this.Controls.Add(this.radTreeView1); this.Name = "Form1"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.radTreeView1)).EndInit(); this.ResumeLayout(false); } #endregion private Telerik.WinControls.UI.RadTreeView radTreeView1; } } Form1.cs
#region Using Statements using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Telerik.WinControls.UI; using Telerik.WinControls; using System.Drawing.Drawing2D; using Telerik.WinControls.Primitives; #endregion namespace RadControlsWinFormsApp1 { public partial class Form1 : Form { #region Ctor public Form1() { InitializeComponent(); this.radTreeView1.CheckBoxes = true; DataTable table = new DataTable(); table.Columns.Add("Id", typeof(int)); table.Columns.Add("ParentId", typeof(int)); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Rows.Add(1, 0, 25, "Indocin"); table.Rows.Add(2, 0, 50, "Enebrel"); table.Rows.Add(3, 1, 10, "Hydralazine"); table.Rows.Add(4, 2, 21, "Combivent"); table.Rows.Add(5, 1, 100, "Dilantin"); this.radTreeView1.DisplayMember = "Drug"; this.radTreeView1.ChildMember = "Id"; this.radTreeView1.ParentMember = "ParentId"; this.radTreeView1.DataSource = table; this.radTreeView1.ExpandAll(); } #endregion #region Create Node Element private void radTreeView1_CreateNodeElement(object sender, Telerik.WinControls.UI.CreateTreeNodeElementEventArgs e) { e.NodeElement = new RadCustomTreeNodeElementWithExtraCheckBox(); } #endregion private void radTreeView1_NodeCheckedChanged(object sender, RadTreeViewEventArgs e) { MessageBox.Show(e.Node.Text + " (primary check) " + e.Node.CheckState.ToString()); } } public class RadCustomTreeNodeElementWithExtraCheckBox : TreeNodeElement { protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; ; } protected override TreeNodeContentElement CreateContentElement() { return new RadCustomContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } public class RadCustomContentElement : TreeNodeContentElement { TreeNodeCheckBoxElement checkElement; LightVisualElement textElement; TreeNodeElement treenodeElement; protected override Type ThemeEffectiveType { get { return typeof(TreeNodeContentElement); } } protected override void InitializeFields() { base.InitializeFields(); } public override void Synchronize() { base.Synchronize(); treenodeElement = this.NodeElement; textElement.Text = treenodeElement.Data.Text; this.DrawText = false; this.DrawFill = false; this.DrawBorder = false; } protected override void CreateChildElements() { base.CreateChildElements(); // add the text element textElement = new LightVisualElement(); this.textElement.Padding = new Padding(20, 0, 0, 0); this.textElement.TextAlignment = ContentAlignment.TopLeft; this.Children.Add(textElement); // add the checkbox element checkElement = new TreeNodeCheckBoxElement(); this.checkElement.Padding = new Padding(0, 0, 0, 0); this.checkElement.ToggleStateChanged += new StateChangedEventHandler(checkElement_ToggleStateChanged); this.Children.Add(checkElement); } void checkElement_ToggleStateChanged(object sender, StateChangedEventArgs args) { MessageBox.Show(this.textElement.Text + " (additional check) " + args.ToggleState.ToString()); } } } Hope that helps
Richard
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 01:22 PM
Hi Richard
Thanks for your quick reply. I've had a go with your suggested approach but unfortunately overriding CreateChildElements within the Content Element ties the action of the new checkbox to the click event on the Content element and I need that event elsewhere in my solution.
I can create the checkbox with an independent action if I override CreateChildElements in the RadCustomTreeNodeElementWithExtraCheckBox Class as follows. This produces the result in the attached file.
This is great as far as it goes but I'm still uncertain on two matters
Regards
Ian
Thanks for your quick reply. I've had a go with your suggested approach but unfortunately overriding CreateChildElements within the Content Element ties the action of the new checkbox to the click event on the Content element and I need that event elsewhere in my solution.
I can create the checkbox with an independent action if I override CreateChildElements in the RadCustomTreeNodeElementWithExtraCheckBox Class as follows. This produces the result in the attached file.
public class RadCustomTreeNodeElementWithExtraCheckBox: TreeNodeElement { TreeNodeCheckBoxElement chkBox2; protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; } public override void Synchronize() { base.Synchronize(); } protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.Padding = new Padding(0, 0, 0, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; this.chkBox2.ToggleStateChanged += new StateChangedEventHandler(chkBox2_ToggleStateChanged); this.Children.Insert(2, chkBox2); base.UpdateLayout(); } void chkBox2_ToggleStateChanged(object sender, StateChangedEventArgs args) { MessageBox.Show( " (additional check) " + args.ToggleState.ToString()); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } }This is great as far as it goes but I'm still uncertain on two matters
- How I get the ToggleStateChanged event on the checkbox to raise a NodeCheckChanged event specific to the new checkbox on the node itself. I need this as I am managing a particular system setting based on the existing NodeCheckChanged and need another NodeCheckChanged to allow me to access Node properties during the event as part of the another setting's management.
- Why the layout of the Content elements is skewed to the right. I've tried turning righttoleft to "No" but this has had no effect. I have also tried capturing the RighttoLeft Changing event and resetting to "No" if Yes" was the value but this has not worked either.
Your thoughts would be much appreciated.
Regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 29 Mar 2011, 01:38 PM
Hello Ian,
Perhaps this will help you whilst I look at the remainder of your questions... (brings the text in line correctly)
Will try and get back to you shortly with other answers
Richard
Perhaps this will help you whilst I look at the remainder of your questions... (brings the text in line correctly)
protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.Padding = new Padding(0, 0, 0, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; chkBox2.StretchHorizontally = false; // it was strethched.... this.chkBox2.ToggleStateChanged += new StateChangedEventHandler(chkBox2_ToggleStateChanged); this.Children.Insert(2, chkBox2); base.UpdateLayout(); }Will try and get back to you shortly with other answers
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 29 Mar 2011, 03:07 PM
Hi Again,
Ok, I think this will do what you need. I have made an inherited RadTreeView that raises an additional event for the new checkbox.
Form1.Designer.cs
Form1.cs
RadTreeViewTwoCheckboxes.cs
AdditionalNodeCheckedChangedEventArgs.cs
it could probably do with a bit of tidying up, but I think it's basically all there.
Hope this helps
Richard
Ok, I think this will do what you need. I have made an inherited RadTreeView that raises an additional event for the new checkbox.
Form1.Designer.cs
namespace RadControlsWinFormsApp1 { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.radTreeViewTwoCheckBoxes1 = new RadTreeViewTwoCheckBoxes(); ((System.ComponentModel.ISupportInitialize)(this.radTreeViewTwoCheckBoxes1)).BeginInit(); this.SuspendLayout(); // // radTreeViewTwoCheckBoxes1 // this.radTreeViewTwoCheckBoxes1.Dock = System.Windows.Forms.DockStyle.Fill; this.radTreeViewTwoCheckBoxes1.Location = new System.Drawing.Point(0, 0); this.radTreeViewTwoCheckBoxes1.Name = "radTreeViewTwoCheckBoxes1"; this.radTreeViewTwoCheckBoxes1.Size = new System.Drawing.Size(359, 342); this.radTreeViewTwoCheckBoxes1.TabIndex = 0; this.radTreeViewTwoCheckBoxes1.Text = "radTreeViewTwoCheckBoxes1"; this.radTreeViewTwoCheckBoxes1.AdditionaNodeCheckedChanged += new AdditionalNodeCheckedChangedHandler(this.radTreeViewTwoCheckBoxes1_AdditionaNodeCheckedChanged); this.radTreeViewTwoCheckBoxes1.NodeCheckedChanged += new Telerik.WinControls.UI.RadTreeView.TreeViewEventHandler(this.radTreeViewTwoCheckBoxes1_NodeCheckedChanged); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(359, 342); this.Controls.Add(this.radTreeViewTwoCheckBoxes1); this.Name = "Form1"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.radTreeViewTwoCheckBoxes1)).EndInit(); this.ResumeLayout(false); } #endregion private RadTreeViewTwoCheckBoxes radTreeViewTwoCheckBoxes1; } } Form1.cs
#region Using Statements using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Telerik.WinControls.UI; using Telerik.WinControls; using System.Drawing.Drawing2D; using Telerik.WinControls.Primitives; #endregion namespace RadControlsWinFormsApp1 { public partial class Form1 : Form { #region Ctor public Form1() { InitializeComponent(); this.radTreeViewTwoCheckBoxes1.CheckBoxes = true; DataTable table = new DataTable(); table.Columns.Add("Id", typeof(int)); table.Columns.Add("ParentId", typeof(int)); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Rows.Add(1, 0, 25, "Indocin"); table.Rows.Add(2, 0, 50, "Enebrel"); table.Rows.Add(3, 1, 10, "Hydralazine"); table.Rows.Add(4, 2, 21, "Combivent"); table.Rows.Add(5, 1, 100, "Dilantin"); this.radTreeViewTwoCheckBoxes1.DisplayMember = "Drug"; this.radTreeViewTwoCheckBoxes1.ChildMember = "Id"; this.radTreeViewTwoCheckBoxes1.ParentMember = "ParentId"; this.radTreeViewTwoCheckBoxes1.DataSource = table; this.radTreeViewTwoCheckBoxes1.ExpandAll(); } #endregion private void radTreeViewTwoCheckBoxes1_AdditionaNodeCheckedChanged(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e) { MessageBox.Show(e.Node.Text + " (additional) " + e.AdditionalCheckboxToggleState.ToString()); } private void radTreeViewTwoCheckBoxes1_NodeCheckedChanged(object sender, RadTreeViewEventArgs e) { MessageBox.Show(e.Node.Text + " (primary) " + e.Node.CheckState.ToString()); } } } RadTreeViewTwoCheckboxes.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing.Drawing2D; using Telerik.WinControls.UI; using System.Windows.Forms; public delegate void AdditionalElementNodeCheckedChangedHandler(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e); public delegate void AdditionalNodeCheckedChangedHandler(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e); class RadTreeViewTwoCheckBoxes : RadTreeView { public event AdditionalNodeCheckedChangedHandler AdditionaNodeCheckedChanged; public RadTreeViewTwoCheckBoxes() { base.CreateNodeElement += new CreateTreeNodeElementEventHandler(RadTreeViewTwoCheckBoxes_CreateNodeElement); } void RadTreeViewTwoCheckBoxes_CreateNodeElement(object sender, CreateTreeNodeElementEventArgs e) { e.NodeElement = new RadCustomTreeNodeElementWithExtraCheckBox(); RadCustomTreeNodeElementWithExtraCheckBox element = (RadCustomTreeNodeElementWithExtraCheckBox)e.NodeElement; element.AdditionalElementNodeCheckedChanged += new AdditionalElementNodeCheckedChangedHandler(element_AdditionalNodeCheckedChanged); } void element_AdditionalNodeCheckedChanged(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e) { if (AdditionaNodeCheckedChanged != null) {AdditionaNodeCheckedChanged(sender, e); } } public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } set {} } private class RadCustomTreeNodeElementWithExtraCheckBox : TreeNodeElement { public event AdditionalElementNodeCheckedChangedHandler AdditionalElementNodeCheckedChanged; TreeNodeCheckBoxElement chkBox2; protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; } public override void Synchronize() { base.Synchronize(); } protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.Padding = new Padding(0, 0, 0, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; chkBox2.StretchHorizontally = false; this.chkBox2.ToggleStateChanged += new StateChangedEventHandler(chkBox2_ToggleStateChanged); this.Children.Insert(2, chkBox2); base.UpdateLayout(); } void chkBox2_ToggleStateChanged(object sender, StateChangedEventArgs args) { AdditionalElementNodeCheckedChanged(sender, new AdditionalNodeCheckboxCheckedChangedEventArgs(this.Data, args.ToggleState)); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } } AdditionalNodeCheckedChangedEventArgs.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Telerik.WinControls.UI; using Telerik.WinControls.Enumerations; public class AdditionalNodeCheckboxCheckedChangedEventArgs : EventArgs { public AdditionalNodeCheckboxCheckedChangedEventArgs(RadTreeNode node, ToggleState state) { this.Node = node; this.AdditionalCheckboxToggleState = state; } public RadTreeNode Node { get; set; } public ToggleState AdditionalCheckboxToggleState { get; set; } } it could probably do with a bit of tidying up, but I think it's basically all there.
Hope this helps
Richard
0
Ian
Top achievements
Rank 1
answered on 29 Mar 2011, 09:42 PM
Hi Richard,
Apologies for the delay but I had to go to bed at some point last night.
Many, many thanks for your great code. I now have a working additional checkbox and access to all the necessary properties to manage the system settings I was discussing in earlier posts.
In appreciation
Regards
Ian
Apologies for the delay but I had to go to bed at some point last night.
Many, many thanks for your great code. I now have a working additional checkbox and access to all the necessary properties to manage the system settings I was discussing in earlier posts.
In appreciation
Regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 29 Mar 2011, 10:27 PM
Hi Ian,
Very glad I could be of help. It was interesting to do and to work with the newly released RadTreeView.
All the best
Richard
Very glad I could be of help. It was interesting to do and to work with the newly released RadTreeView.
All the best
Richard
0
Ian
Top achievements
Rank 1
answered on 30 Mar 2011, 01:24 AM
Hi Richard
Now that I have a better grip on the structure of the childern in the nodes it is proving to be a very flexible addition to our solution.
Thanks again
Regards
Ian
Now that I have a better grip on the structure of the childern in the nodes it is proving to be a very flexible addition to our solution.
Thanks again
Regards
Ian
0
Ian
Top achievements
Rank 1
answered on 30 Mar 2011, 03:29 AM
Hi Richard
I modified the AdditionalNodeCheckboxCheckedChangedEventArgs class to include the treeNodeElement as I needed to access the other children of the element. The args look like this now:
public class AdditionalNodeCheckboxCheckedChangedEventArgs : EventArgs { public AdditionalNodeCheckboxCheckedChangedEventArgs(RadTreeNode node, TreeNodeElement nodeElement, ToggleState state) { this.Node = node; this.NodeElement = nodeElement; this.AdditionalCheckboxToggleState = state; } public RadTreeNode Node { get; set; } public ToggleState AdditionalCheckboxToggleState { get; set; } public TreeNodeElement NodeElement { get; set; } }public delegate void AdditionalElementNodeCheckedChangedHandler(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e); public delegate void AdditionalNodeCheckedChangedHandler(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e); public class RadCustomTreeView : RadTreeView { public event AdditionalNodeCheckedChangedHandler AdditionaNodeCheckedChanged; public RadCustomTreeView() { base.CreateNodeElement += new CreateTreeNodeElementEventHandler(RadCustomTreeView_CreateNodeElement); } void RadCustomTreeView_CreateNodeElement(object sender, CreateTreeNodeElementEventArgs e) { e.NodeElement = new RadCustomTreeNodeElementWithExtraCheckBox(); RadCustomTreeNodeElementWithExtraCheckBox element = (RadCustomTreeNodeElementWithExtraCheckBox)e.NodeElement; element.AdditionalElementNodeCheckedChanged += new AdditionalElementNodeCheckedChangedHandler(element_AdditionalNodeCheckedChanged); } void element_AdditionalNodeCheckedChanged(object sender, AdditionalNodeCheckboxCheckedChangedEventArgs e) { if (AdditionaNodeCheckedChanged != null) { AdditionaNodeCheckedChanged(sender, e); } } public override string ThemeClassName { get { return typeof(RadTreeView).FullName; } set { } } private class RadCustomTreeNodeElementWithExtraCheckBox : TreeNodeElement { public event AdditionalElementNodeCheckedChangedHandler AdditionalElementNodeCheckedChanged; TreeNodeCheckBoxElement chkBox2; protected override void InitializeFields() { base.InitializeFields(); this.StretchHorizontally = false; this.StretchVertically = false; } public override void Synchronize() { base.Synchronize(); } protected override void CreateChildElements() { base.CreateChildElements(); chkBox2 = new TreeNodeCheckBoxElement(); chkBox2.Padding = new Padding(5, 0, 5, 0); chkBox2.SmoothingMode = SmoothingMode.AntiAlias; chkBox2.CheckMarkPrimitive.CheckElement.ForeColor = Color.Red; chkBox2.StretchHorizontally = false; this.chkBox2.ToggleStateChanged += new StateChangedEventHandler(chkBox2_ToggleStateChanged); this.Children.Insert(2, chkBox2); base.UpdateLayout(); } void chkBox2_ToggleStateChanged(object sender, StateChangedEventArgs args) { AdditionalElementNodeCheckedChanged(sender, new AdditionalNodeCheckboxCheckedChangedEventArgs(this.Data, this, args.ToggleState)); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } }Other users trying to solve similar problems may find this extra information useful. How the final version looks is in the attached file
Regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 30 Mar 2011, 09:21 AM
Hi Ian,
I guess you're sleeping now...but just for as a note, you could actually do away with the Node in the EventArgs as the NodeElement.Data property is the node itself. Perhaps you want to keep it though for readability.
Let me know if there's anything further you need
Richard
I guess you're sleeping now...but just for as a note, you could actually do away with the Node in the EventArgs as the NodeElement.Data property is the node itself. Perhaps you want to keep it though for readability.
Let me know if there's anything further you need
Richard
0
Ian
Top achievements
Rank 1
answered on 30 Mar 2011, 10:50 AM
Hi Richard
Understand your comment but will probably keep Node for now.
I have another little problem if you'd like to have a think about it?
I'm using a context menu (activated on a right click ) to allow the user to automatically check all the standard checkboxes as well as all the additonal checkboxes we added. The NodeMouseDown event args only expose the Node and not the NodeElement so I was wondering how I might be able to reference the NodeElement child which is the additonal checkbox in order to examine and set its ToggleState? Am I being stupid? I think its been a long day.
Hope you understand this ramble. :-)
Regards
Ian
Understand your comment but will probably keep Node for now.
I have another little problem if you'd like to have a think about it?
I'm using a context menu (activated on a right click ) to allow the user to automatically check all the standard checkboxes as well as all the additonal checkboxes we added. The NodeMouseDown event args only expose the Node and not the NodeElement so I was wondering how I might be able to reference the NodeElement child which is the additonal checkbox in order to examine and set its ToggleState? Am I being stupid? I think its been a long day.
Hope you understand this ramble. :-)
Regards
Ian
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 30 Mar 2011, 11:56 AM
Hi Ian,
There are probably other ways to do this, but this seems to be quite a quick way.
1: In the Form (where you want to check all the checkboxes) call:
2: In the RadTreeViewTwoCheckBoxes class
a: Add a private list of all the node elements
b: Alter the CreateNodeElement to add each element to the List.
c: Provide a CheckAll method to check all the nodes, and additional checkboxes in the treeview
Hope that this helps.
All the best
Richard
EDIT// Adding small video demo
There are probably other ways to do this, but this seems to be quite a quick way.
1: In the Form (where you want to check all the checkboxes) call:
this.radTreeViewTwoCheckBoxes1.CheckAll();2: In the RadTreeViewTwoCheckBoxes class
a: Add a private list of all the node elements
private List<TreeNodeElement> nodeElements = new List<TreeNodeElement>();b: Alter the CreateNodeElement to add each element to the List.
void RadTreeViewTwoCheckBoxes_CreateNodeElement(object sender, CreateTreeNodeElementEventArgs e) { e.NodeElement = new RadCustomTreeNodeElementWithExtraCheckBox(); RadCustomTreeNodeElementWithExtraCheckBox element = (RadCustomTreeNodeElementWithExtraCheckBox)e.NodeElement; element.AdditionalElementNodeCheckedChanged += new AdditionalElementNodeCheckedChangedHandler(element_AdditionalNodeCheckedChanged); nodeElements.Add(element); }c: Provide a CheckAll method to check all the nodes, and additional checkboxes in the treeview
public void CheckAll() { for (int i = 0; i <= this.nodeElements.Count-1; i++) { ((TreeNodeCheckBoxElement)this.nodeElements[i].Children[3]).Checked = true; ((TreeNodeCheckBoxElement)this.nodeElements[i].Children[2]).Checked = true; } }Hope that this helps.
All the best
Richard
EDIT// Adding small video demo
0
Ian
Top achievements
Rank 1
answered on 30 Mar 2011, 01:35 PM
Hi Richard
Once again...brilliant. Your concept of the List being created at the time of element creation led me to a solution. I needed to be able to set the checked values by subtree i.e the rightclicked node and its child nodes. To keep track of the nodes into which the elements were created I used a dictionary instead of a list as follows
I then created a Method on the CustomTreeView to change the Togglestate of a node element's TreeNodeCheckBoxElement - but only that element which matched a node in the dictionary passed to the method
Then in my main form I run the following methods. The first method handles the click event from the context menu item while the second runs through the subtree under the clicked node changing the togglestates as required.
Quite neat and tidy!
Many thanks for kicking me off in the right direction.
regards
Ian
Once again...brilliant. Your concept of the List being created at the time of element creation led me to a solution. I needed to be able to set the checked values by subtree i.e the rightclicked node and its child nodes. To keep track of the nodes into which the elements were created I used a dictionary instead of a list as follows
private Dictionary<RadCustomTreeNode, TreeNodeElement> nodeElements = new Dictionary<RadCustomTreeNode, TreeNodeElement>();nodeElements.Add((RadCustomTreeNode)e.Node,element);I then created a Method on the CustomTreeView to change the Togglestate of a node element's TreeNodeCheckBoxElement - but only that element which matched a node in the dictionary passed to the method
public void NodeExecuteToggleOn(RadCustomTreeNode node) { TreeNodeElement value; if (nodeElements.TryGetValue(node, out value)) { ((TreeNodeCheckBoxElement)value.Children[2]).ToggleState = ToggleState.On; nodeElements[node] = value; } Then in my main form I run the following methods. The first method handles the click event from the context menu item while the second runs through the subtree under the clicked node changing the togglestates as required.
void rmiExecuteAllCheckboxes_Click(object sender, EventArgs e) { tvAlphaWorkspace.NodeExecuteToggleOn(workspaceContextNode); TreeNodeRecursiveExecuteAll(workspaceContextNode.Nodes); } private void TreeNodeRecursiveExecuteAll(RadTreeNodeCollection nodes) { foreach (RadCustomTreeNode myNode in nodes) { tvAlphaWorkspace.NodeExecuteToggleOn(myNode); TreeNodeRecursiveExecuteAll(myNode.Nodes); } }Quite neat and tidy!
Many thanks for kicking me off in the right direction.
regards
Ian
0
Richard Slade
Top achievements
Rank 2
answered on 30 Mar 2011, 01:41 PM
Hi Ian,
Again, glad that I could be of some help. As I mentioned, there may be other ways to achieve this via custom nodes or similar, but I think the solution you have is very usable.
Just a couple of other things, if this helped, may I ask that you also mark as answer, and also if you have further questions that are on a different topic to the original question, then please could you post these in a new forum thread so others can quickly find answers to the topic described in the title.
Thanks for letting me know your progress and results.
All the best
Richard
Again, glad that I could be of some help. As I mentioned, there may be other ways to achieve this via custom nodes or similar, but I think the solution you have is very usable.
Just a couple of other things, if this helped, may I ask that you also mark as answer, and also if you have further questions that are on a different topic to the original question, then please could you post these in a new forum thread so others can quickly find answers to the topic described in the title.
Thanks for letting me know your progress and results.
All the best
Richard
0
Swati
Top achievements
Rank 1
answered on 28 Aug 2012, 02:38 PM
Can you please tell me when is the RadFormatting event fires...I mean if i want to disable check boxes for sub Folders if main Folders is checked..then How to use RadFormatting event for disabling checkboxes...
0
Hello Swati,
Thank you for writing.
The formatting events are fired constantly when a visual update is needed. Here is how you can disable the child nodes check boxes if the parent node check box is checked:
I hope this helps.
Best wishes,
Jack
the Telerik team
Thank you for writing.
The formatting events are fired constantly when a visual update is needed. Here is how you can disable the child nodes check boxes if the parent node check box is checked:
void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e){ if (e.Node.Parent != null && e.Node.Parent.Checked) { e.NodeElement.ToggleElement.Enabled = false; } else { e.NodeElement.ToggleElement.Enabled = true; }}I hope this helps.
Best wishes,
Jack
the Telerik team
0
Andrew
Top achievements
Rank 1
answered on 02 Aug 2013, 10:14 AM
Hello
I need this feature: "Disable Checkboxes in Treeview but keep them visible" in my Silverlight control.
Unfortunately, Silverlight version doesn't expose NodeFormatting event.
Thanks.
I need this feature: "Disable Checkboxes in Treeview but keep them visible" in my Silverlight control.
Unfortunately, Silverlight version doesn't expose NodeFormatting event.
Thanks.
0
Hi Andrew,
This forum concerns RadControls for WinForms, while your question is about RadControls for Silverlight. Please address it in the appropriate forums so you can get adequate response: http://www.telerik.com/community/forums/silverlight/treeview.aspx.
Regards,
Stefan
Telerik
This forum concerns RadControls for WinForms, while your question is about RadControls for Silverlight. Please address it in the appropriate forums so you can get adequate response: http://www.telerik.com/community/forums/silverlight/treeview.aspx.
Regards,
Stefan
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
