In this article I’m going to explain how to use checkbox in dynamically created TreeView in ASP.NET using C# and SQL Server.

        I got one requirement that I need to create TreeView and I should include checkbox functionality to select particular node in TreeView for both parent and child nodes.

        I have used Javascript for avoid postback to check or uncheck all checkboxes in TreeView, also I have included javascript function for get the value of selected node in treeView.   

 In this demo I have created TreeView for display list of state and districts in TreeView.

Note: If you are not aware of creating dynamic TreeView in asp.net you could read my previous article. 

How to create dynamic TreeView in ASP.NET using c#

        Here I’ll show you how to create TreeView dynamically. First we have to create two tables for state and district details.

Table Design (State Master):

Column Name

Data Type

state_id

int

state

varchar(100)

 

Create table script:

CREATE TABLE [dbo].[State_mst](

        [state_id] [int] NULL,

        [state] [varchar](50) NULL

) ON [PRIMARY]

 

Table Design (District Master):

Column Name

Data Type

state_id

int

district_id

int

district

varchar(100)

 

Create table script:

CREATE TABLE [dbo].[District_mst](

        [state_id] [int] NULL,

        [district_id] [int] NULL,

        [district] [varchar](50) NULL

) ON [PRIMARY]

Designer Source Code:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

                                     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<title>TreeView</title>

<script type="text/javascript">

function OnTreeClick(evt) {

    var src = window.event != window.undefined ? window.event.srcElement : evt.target;

    var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");

    if (isChkBoxClick) {

        if (src.checked == true) {

            var nodeText = getNextSibling(src).innerText || getNextSibling(src).innerHTML;

 

            var nodeValue = GetNodeValue(getNextSibling(src));

 

            document.getElementById("label").innerHTML += nodeText + ",";

        }

        else {

            var nodeText = getNextSibling(src).innerText || getNextSibling(src).innerHTML;

            var nodeValue = GetNodeValue(getNextSibling(src));

            var val = document.getElementById("label").innerHTML;

            document.getElementById("label").innerHTML = val.replace(nodeText+",""");

        }              

        var parentTable = GetParentByTagName("table", src);

        var nxtSibling = parentTable.nextSibling;

        //check if nxt sibling is not null & is an element node

        if (nxtSibling && nxtSibling.nodeType == 1) {

            //if node has children   

            if (nxtSibling.tagName.toLowerCase() == "div") {

                //check or uncheck children at all levels

                CheckUncheckChildren(parentTable.nextSibling, src.checked);

            } 

        }

        //check or uncheck parents at all levels

        CheckUncheckParents(src, src.checked);

    }

function CheckUncheckChildren(childContainer, check) {

    var childChkBoxes = childContainer.getElementsByTagName("input");

    var childChkBoxCount = childChkBoxes.length;

    for (var i = 0; i < childChkBoxCount; i++) {

        childChkBoxes[i].checked = check;

    }

}

 

function CheckUncheckParents(srcChild, check) {

    var parentDiv = GetParentByTagName("div", srcChild);

    var parentNodeTable = parentDiv.previousSibling;

    if (parentNodeTable) {

        var checkUncheckSwitch;

        //checkbox checked

        if (check) {

            var isAllSiblingsChecked = AreAllSiblingsChecked(srcChild);

            if (isAllSiblingsChecked)

                checkUncheckSwitch = true;

          else

            return//do not need to check parent if any(one or more) child not checked

        }

        else //checkbox unchecked

        {

            checkUncheckSwitch = false;

        } 

        var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");

        if (inpElemsInParentTable.length > 0) {

            var parentNodeChkBox = inpElemsInParentTable[0];

            parentNodeChkBox.checked = checkUncheckSwitch;

            //do the same recursively

            CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch);

        }

    }

}

 

function AreAllSiblingsChecked(chkBox) {

    var parentDiv = GetParentByTagName("div", chkBox);

    var childCount = parentDiv.childNodes.length;

    for (var i = 0; i < childCount; i++) {

        if (parentDiv.childNodes[i].nodeType == 1) {

            //check if the child node is an element node

          if (parentDiv.childNodes[i].tagName.toLowerCase() == "table") {

          var prevChkBox = parentDiv.childNodes[i].getElementsByTagName("input")[0];

                //if any of sibling nodes are not checked, return false

                if (!prevChkBox.checked) {

                    return false;

                }

            }

        }

    }

    return true;

}

 //utility function to get the container of an element by tagname

function GetParentByTagName(parentTagName, childElementObj) {

    var parent = childElementObj.parentNode;

    while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {

        parent = parent.parentNode;

    }

    return parent;

}

 

function getNextSibling(element) {

    var n = element;

    do n = n.nextSibling;

    while (n && n.nodeType != 1);

    return n;

}

 //returns NodeValue

function GetNodeValue(node) {

    var nodeValue = "";

    var nodePath = node.href.substring(node.href.indexOf(",") + 2, node.href.length - 2);

    var nodeValues = nodePath.split("\\");

    if (nodeValues.length > 1)

        nodeValue = nodeValues[nodeValues.length - 1];

    else

        nodeValue = nodeValues[0].substr(1);

    return nodeValue;

</script>

</head>

<body>

    <form id="form1" runat="server">

    <div>

                    <asp:TreeView ID="tvTables" runat="server" ForeColor="Black" Font-Size="13pt"

                                  ShowCheckBoxes="All" OnClick="OnTreeClick(event)">

                    </asp:TreeView>

    </div>

    </form>

</body>

</html>

 

Here I have written two function that return state and district details as DataTable.

DataRelation:

DataRelation class provides the facility to describe parent-child relationship between two tables in a DataSet. We can define as many relations between any two tables of DataSet. Here we can define relations between state and district table by state_id.

Sample code:       

     ds.Relations.Add("children", dtparent.Columns["state_id"],

                                          dtchild.Columns["state_id"]); 

 

           

Code Behind:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Data;

using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page

{

SqlConnection conn = new SqlConnection("Data Source=SPIDER;Initial Catalog=Demo;Integrated Security=True"); 

    protected void Page_Load(object sender, EventArgs e)

    { 

        if(!IsPostBack) 

        {

            PopulateTreeview();

        } 

    } 

    private void PopulateTreeview()

    {

        try

        {

            DataSet ds = new DataSet();

            DataTable dtparent = new DataTable();

            DataTable dtchild = new DataTable();

            dtparent = FillParentTable();

            dtparent.TableName = "A";

            dtchild = FillChildTable();

            dtchild.TableName = "B"

            ds.Tables.Add(dtparent);

            ds.Tables.Add(dtchild); 

            ds.Relations.Add("children", dtparent.Columns["state_id"],

                                          dtchild.Columns["state_id"]); 

            if (ds.Tables[0].Rows.Count > 0)

            {

                tvTables.Nodes.Clear(); 

                foreach (DataRow masterRow in ds.Tables[0].Rows)

                {

                    TreeNode masterNode = new TreeNode((string)masterRow["state"],

                                          Convert.ToString(masterRow["state_id"]));

                    tvTables.Nodes.Add(masterNode);

                    tvTables.CollapseAll();

                    foreach (DataRow childRow in masterRow.GetChildRows("Children"))

                    {

                        TreeNode childNode = new TreeNode((string)childRow["district"],

                                              Convert.ToString(childRow["state_id"]));

                        masterNode.ChildNodes.Add(childNode);

                        childNode.Value = Convert.ToString(childRow["district_id"]);

                    }

                }

            }

        }

        catch (Exception ex)

        {

            throw new Exception("Unable to populate treeview" + ex.Message);

        }

    }

 

    private DataTable FillParentTable()

    {

        DataTable dt = new DataTable();

        conn.Open();

        string cmdstr = "Select * from State_mst";

        SqlCommand cmd = new SqlCommand(cmdstr, conn);

        SqlDataAdapter adp = new SqlDataAdapter(cmd);

        adp.Fill(dt);

        conn.Close();     

        return dt;

    }

 

    private DataTable FillChildTable()

    {

        DataTable dt = new DataTable();

        conn.Open();

        string cmdstr = "Select * from District_mst";

        SqlCommand cmd = new SqlCommand(cmdstr, conn);

        SqlDataAdapter adp = new SqlDataAdapter(cmd);

        adp.Fill(dt);

        conn.Close();      

        return dt;

    }    

 


View demo Download
http://www.dotnetfox.com/Document/1014/0Demo1.gif

If you enjoyed this article, get email updates (it's free).



Comments
comments powered by Disqus

Thanks for downloading..!!

×
Subscribe via Email
    
message to display in fancybox