user3920526
user3920526

Reputation: 397

How to capture changed Select/UnSelected Checkbox Node in a TreeView

I have an asp Treeview which i made for my understanding. I would like to capture all the check and uncheck checkboxes node user selects.

I have tried to use a button click event in which i check for a CheckNodes. But i would like to know how to get the UnSelected nodes before he click the Save Button.

As per code, This is the format of my treeview On Page Load only 3 nodes are checked.

What if the user unselects few node and presses the save button.

How do i know capture the information of checkbox selected/Unselect on postback.

enter image description here

User Action

  1. Selects -- Head1Child1GrandChild1
  2. Unselects -- Head1Child2 && Head1Child3

  3. Expected Result : Need to capture checkbox Selects -- Head1Child1 && Head1Child1GrandChild1 (Code in Save_Click)

    AND Also need to capture

    Unselects -- Head1Child2 && Head1Child3

The given treeview is just a prototype to understand the problem for me. Imagine if there is 1000 nodes and user selects some node and unselects the selected node . I just want to get those unselected and selected node only. Thats it.

enter image description here


Thank you for your time.

<body>
    <form id="form1" runat="server">
        <div>
            <asp:TreeView ID="TreeView1" ShowCheckBoxes="All" Showlines="true" runat="server"></asp:TreeView>
            <asp:Button ID="Button1" runat="server" OnClick="Save_Click" Text="Save" />
            <br />
        </div>
    </form>
</body>


    //CS Code
    //TreeView on a PageLoad. 
    //It will create TreeView with all Checkbox checked
    // If the user Unselects one check box how do i capture that in a event ? 



  protected void Page_Load(object sender, EventArgs e)
            {
              if(!IsPostback)
{
                TreeNode tNode1 = new TreeNode();
                tNode1.Text = "HeadNode1";
                tNode1.Value = "HeadNode1";

                TreeNode h1ChildNode1 = new TreeNode();
                h1ChildNode1.Text = "Head1Child1";
                tNode1.ChildNodes.Add(h1ChildNode1);

                TreeNode h1GrandChild1 = new TreeNode();
                h1GrandChild1.Text = "Head1Child1Grand1";
                h1ChildNode1.ChildNodes.Add(h1GrandChild1);

                TreeNode h1ChildNode2 = new TreeNode();
                h1ChildNode2.Text = "Head1Child2";
                tNode1.ChildNodes.Add(h1ChildNode2);

                TreeNode h1ChildNode3 = new TreeNode();
                h1ChildNode3.Text = "Head1Child3";
                tNode1.ChildNodes.Add(h1ChildNode3);
                TreeView1.Nodes.Add(tNode1);

                TreeNode tNode2 = new TreeNode();
                tNode2.Text = "HeadNode2";
                tNode2.Value = "HeadNode2";


                TreeView1.Nodes.Add(tNode2);

                ServerSideChangeSelection(TreeView1, true);

            }

           protected TreeView ServerSideChangeSelection(TreeView t, bool check)
        {
            foreach (TreeNode tn in t.Nodes)
            {
                tn.Checked = false;
                if (tn.ChildNodes.Count > 0)
                {
                    foreach (TreeNode childNd in tn.ChildNodes)
                    {
                        childNd.Checked = check;

                    }                    
                }
            }
            return t;
        }
}

//Save Button Click for CheckNodes. Missing UnSelect Nodes ??

            protected void Save_Click(object sender, EventArgs e)
            {
                List<string> checkNodes = new List<string>();
                List<string> unCheckNodes = new List<string>();


                foreach (var item in TreeView1.CheckedNodes)
                {

                    checkNodes.Add(item.ToString());
                 }
            }

Upvotes: 0

Views: 1139

Answers (1)

Gauravsa
Gauravsa

Reputation: 6524

I will make some changes to your code:

Created a property like below:

public List<TreeNode> Nodes
{
    get
    {
        if (HttpContext.Current.Session["Nodes"] == null)
        {
            HttpContext.Current.Session["Nodes"] = new List<TreeNode>();
        }
        return HttpContext.Current.Session["Nodes"] as List<TreeNode>;
    }
    set
    {
        HttpContext.Current.Session["Nodes"] = value;
    }
}

In your page_load:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        TreeNode tNode1 = new TreeNode();
        tNode1.Text = "HeadNode1";
        tNode1.Value = "HeadNode1";

        TreeNode h1ChildNode1 = new TreeNode();
        h1ChildNode1.Text = "Head1Child1";
        tNode1.ChildNodes.Add(h1ChildNode1);

        TreeNode h1GrandChild1 = new TreeNode();
        h1GrandChild1.Text = "Head1Child1Grand1";
        h1ChildNode1.ChildNodes.Add(h1GrandChild1);

        TreeNode h1ChildNode2 = new TreeNode();
        h1ChildNode2.Text = "Head1Child2";
        tNode1.ChildNodes.Add(h1ChildNode2);

        TreeNode h1ChildNode3 = new TreeNode();
        h1ChildNode3.Text = "Head1Child3";
        tNode1.ChildNodes.Add(h1ChildNode3);
        TreeView1.Nodes.Add(tNode1);

        TreeNode tNode2 = new TreeNode();
        tNode2.Text = "HeadNode2";
        tNode2.Value = "HeadNode2";

        TreeView1.Nodes.Add(tNode2);

        ServerSideChangeSelection(TreeView1, true);
        List<TreeNode> nodes = new List<TreeNode>();

        foreach (TreeNode node in TreeView1.Nodes)
        {
            nodes.Add(node);
            if (node.ChildNodes.Count > 0)
            {
                foreach (TreeNode childNode in node.ChildNodes)
                {
                    nodes.Add(childNode);
                }
            }
        }

        Nodes = nodes;
    }
}

Save_Click:

protected void Save_Click(object sender, EventArgs e)
{
    List<TreeNode> unCheckNodes = new List<TreeNode>();

    GetCheckUncheckTreeNodes(TreeView1.Nodes, ref unCheckNodes);
}

private void GetCheckUncheckTreeNodes(TreeNodeCollection nodeCollection, ref List<TreeNode> unCheckNodes)
{
    if (Nodes != null)
    {
        foreach (TreeNode node in nodeCollection)
        {
            if (!node.Checked && Nodes.Any(x => x.Text == node.Text && x.Checked != node.Checked))
                unCheckNodes.Add(node);

            if (node.ChildNodes.Count > 0)
                GetCheckUncheckTreeNodes(node.ChildNodes, ref unCheckNodes);
        }
    }
}

Upvotes: 1

Related Questions