Override Tri-State functionality

5 posts, 1 answers
  1. Support
    Support avatar
    7 posts
    Member since:
    Apr 2010

    Posted 09 May Link to this post

    Is it possible to override the tristate to allow for Any node to be in a 3 phase status?

    I am working on a security module and the categories that are available to a user will appear in the treeview (all fine and dandy), but there is going to be 3 security modes associated with each litem, Deny, View, or Edit and three phase will work perfectly for this, but the current implementation only seems to allow for a Parent node to be in  an intermediary state.

     

    Can this be overridden to allow for Each node to just have independent control of the three values, to then read and set my security levels?

  2. Answer
    Dess
    Admin
    Dess avatar
    1601 posts

    Posted 10 May Link to this post

    Hello,

    Thank you for writing.

    By default, RadTreeView supports tri-state mode for its nodes automatically. Hence, when one of the child nodes is checked but the others aren't, the parent node's state is ToggleState.Indeterminate. In order to customize the checkboxes and allow three states for each node, you can create a custom  RadTreeNode, override its CheckState property and don't propagate the status change to its children/parents. Additionally, in the NodeFormatting event, it is necessary to enable the three states for each node element. Here is a sample code snippet:
    public Form1()
    {
        InitializeComponent();
     
        this.radTreeView1.NodeFormatting += radTreeView1_NodeFormatting;
     
        for (int i = 0; i < 5; i++)
        {
            CustomTreeNode node = new CustomTreeNode() { Text = "Node" + i };
            for (int j = 0; j < 3; j++)
            {
                CustomTreeNode subNode = new CustomTreeNode() { Text = "SubNode" + i + "." + j };
                node.Nodes.Add(subNode);
            }
            this.radTreeView1.Nodes.Add(node);
        }
     
        this.radTreeView1.CheckBoxes = true;
        this.radTreeView1.TriStateMode = true;
    }
     
    private void radTreeView1_NodeFormatting(object sender, TreeNodeFormattingEventArgs e)
    {
        ((RadCheckBoxElement)e.NodeElement.ToggleElement).IsThreeState = true;
    }
     
    public class CustomTreeNode : RadTreeNode
    {
        public override Telerik.WinControls.Enumerations.ToggleState CheckState
        {
            get
            {
                return base.CheckState;
            }
            set
            {
                this.SetCheckStateCore(value);
            }
        }
    }

    I hope this information helps. Should you have further questions I would be glad to help.

     Regards,
    Dess
    Telerik
    Do you need help with upgrading your AJAX, WPF or WinForms project? Check the Telerik API Analyzer and share your thoughts.
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Support
    Support avatar
    7 posts
    Member since:
    Apr 2010

    Posted 11 May in reply to Dess Link to this post

    Thanks for that code, works perfectly..But now I also want to “re-implement” the functionality of checking all children with the parent state.

    I added a recursion of a function to recurse after the CheckState Changed, ant it works if traced through, but at full speed, it basically gets one state off for all the children…

    If there another method or event to cancel to allow this to happen properly?

    Thanks

    Class RadTriStateNode
        Inherits RadTreeNode

        Public Overrides Property CheckState As Telerik.WinControls.Enumerations.ToggleState
            Get
                Return MyBase.CheckState
            End Get
            Set(value As Telerik.WinControls.Enumerations.ToggleState)
                Me.SetCheckStateCore(value)
                CheckUncheckTreeNode(Me.Nodes, value)
            End Set
        End Property


        Private Sub CheckUncheckTreeNode(trNodeCollection As RadTreeNodeCollection, CheckedState As Telerik.WinControls.Enumerations.ToggleState)
            For Each trNode As RadTriStateNode In Me.Nodes
                trNode.SetCheckStateCore(Me.CheckState)

            Next
        End Sub



    End Class
  5. Support
    Support avatar
    7 posts
    Member since:
    Apr 2010

    Posted 11 May in reply to Support Link to this post

    Actually you can close this now. I  replaced that code with overriding the OnCheckStatusChanges(checkedMode as CheckedMode) routine and added the
    For Each trNode As RadTriStateNode In Me.Nodes
        trNode.SetCheckStateCore(Me.CheckState)
    Next
    Code within it and that seemed to work.

    Thanks
  6. Dess
    Admin
    Dess avatar
    1601 posts

    Posted 16 May Link to this post

    Hello,

    Thank you for writing back. 

    I am glad that the problem you were facing is now resolved. However, you can find below a sample code snippet demonstrating how to set the ToggleState of a child node considering the parent node's state:
    public class CustomTreeNode : RadTreeNode
    {
        public override Telerik.WinControls.Enumerations.ToggleState CheckState
        {
            get
            {
                return base.CheckState;
            }
            set
            {
                if (this.CheckState != value)
                {
                    this.SetCheckStateCore(value);
                    this.TreeView.BeginUpdate();
                    CheckUncheckTreeNode(this.Nodes, value == ToggleState.Indeterminate ? ToggleState.Off : ToggleState.On);
                    this.TreeView.EndUpdate();
                }
            }
        }
     
        private void CheckUncheckTreeNode(RadTreeNodeCollection trNodeCollection, Telerik.WinControls.Enumerations.ToggleState checkedState)
        {
            foreach (CustomTreeNode trNode in this.Nodes)
            {
                trNode.SetCheckStateCore(checkedState);
            }
        }
    }

    I hope this information helps. If you have any additional questions, please let me know.

    Regards,
    Dess
    Telerik
    Do you need help with upgrading your AJAX, WPF or WinForms project? Check the Telerik API Analyzer and share your thoughts.
Back to Top
UI for WinForms is Visual Studio 2017 Ready