Fun with jQWidgets (jqxTreeGrid)

Introduction

So I’ve been working on this project lately, where my teammate asked me to write an advance TreeView with JQuery. The sample data and the TreeView structure were something like this:

Sample Data

Name Phone CurrentBalance UserType UserCode ParentCode
Hakeem 076 4876 6579 6,026 Administrator AD-00001 NULL
Lucian 055 9658 5713 9,741 Branch BR-00001 AD-00001
Felix 076 2291 6071 8,852 Distributor DR-00001 BR-00001
Aquila 056 5580 0460 9,095 Agent AG-00001 DR-00001
Tyrone 0916 103 0684 5,822 User UR-00001 AG-00001

TreeView Structure

  Name Phone CurrentBalance
Administrator Hakeem 076 4876 6579 6,026
   Branch Lucian 055 9658 5713 9,741
      Distributor Felix 076 2291 6071 8,852
         Agent Aquila 056 5580 0460 9,095
            User Tyrone 0916 103 0684 5,822

Background

As you can see, the TreeView structure follows the parent child relation hierarchy. However, I’ve shown you a single node example here but in reality one node can have multiple child nodes then these child nodes can have multiple child nodes and so on and so forth.

So the first thing that comes to my mind is run a recursive function on this data and bind those data to one of thousands free JQuery TreeView scattered around the web. But to be frank, I don’t like the idea of the recursion. I am not going to say that it increases my data manipulation time, thing is this time I won’t be using recursion.

So I Googled for some JQuery TreeView widgets on the web and finally came across a great JQuery widgets library which has a fantastic TreeView widget that just fits my requirements. So the name of the widget library is jQWidgets. You can surf their official website at this link:

If you go to the demo section, you will see that they have over 42 widgets ready for you. One of those is jqxTreeGrid widget. I read the documentation there and came across some fantastic features the widget provides.

So let’s build a demo application.

Building a Demo Application

Downloading and adding jQWidgets

Go to the official site of jQWidgets and in the download section, download the non-commercial version from there. The scripts will be downloaded as a zip file. Let’s unzip it and from the unzipped folder copy three folders and add to your project. These folders are:

  • jqwidgets
  • scripts
  • styles

Using the Code

To create a list of sample user data, let's create a complex User datatype. Means create a POCO class named User inside the model folder. The class will have these following properties:


namespace jqxTreeGridDemo.Models
{
    public class User
    {
        public string Name { get; set; }
        public string Phone { get; set; }
        public decimal CurrentBalance { get; set; }
        public string UserType { get; set; }
        public string UserCode { get; set; }
        public string ParentCode { get; set; }
    }
}

Let’s go to the code behind of our form and declare a web method. The web method will simply return our predefined sample data in a json format to our UI. Remember to declare your web method as a static member otherwise you won’t able to get data from it with an Ajax call.

Building and sending a list of collection in json format will require a small library. So fire up the NuGet package manager and install the package called JSON.net.

Okay, so our web method will look like this:


[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string GetData()
{
    List<User> users = new List<User>
    {
        new User {Name = "Hakeem", Phone = "076 4876 6579", 
        CurrentBalance = 6026, UserType = "Administrator", UserCode = "AD-00001"},
        new User {Name = "Lucian", Phone = "055 9658 5713", 
        CurrentBalance = 9741, UserType = "Branch", 
        UserCode = "BR-00001", ParentCode = "AD-00001"},
        new User {Name = "Felix",  Phone = "076 2291 6071", 
        CurrentBalance = 8852, UserType = "Distributor", 
        UserCode = "DR-00001", ParentCode = "BR-00001"},
        new User {Name = "Aquila", Phone = "056 5580 0460", 
        CurrentBalance = 9095, UserType = "Agent", 
        UserCode = "AG-00001", ParentCode = "DR-00001"},
        new User {Name = "Tyrone", Phone = "0916 103 0684", 
        CurrentBalance = 5822, UserType = "User", 
        UserCode = "UR-00001", ParentCode = "AG-00001 
        new User {Name = "Jasper", Phone = "0916 103 0684", 
        CurrentBalance = 9935 , UserType = "Branch", 
        UserCode = "BR-00002", ParentCode = "AD-00001"},
        new User {Name = "Erasmus", Phone = "0314 951 0576", 
        CurrentBalance = 5636 , UserType = "Distributor", 
        UserCode = "DR-00002", ParentCode = "BR-00002"},
        new User {Name = "Elton", Phone = "0887 799 4296", 
        CurrentBalance = 6448 , UserType = "Distributor", 
        UserCode = "DR-00003", ParentCode = "BR-00002"},
        new User {Name = "Colt", Phone = "07624 841017", 
        CurrentBalance = 5425, UserType = "Agent", 
        UserCode = "AG-00002", ParentCode = "DR-00003"},
        new User {Name = "Phillip", Phone = "070 7469 2182", 
        CurrentBalance = 8344, UserType = "User", 
        UserCode = "UR-00002", ParentCode = "AG-00001"},
        new User {Name = "Lucian", Phone = "055 9658 5713", 
        CurrentBalance = 9741, UserType = "User", 
        UserCode = "UR-00003", ParentCode = "AG-00001"},
        new User {Name = "Aron", Phone = "0800 722148", 
        CurrentBalance = 5527, UserType = "User", 
        UserCode = "UR-00004", ParentCode = "AG-00002"},
    };
    string data = JsonConvert.SerializeObject(users);
    return data;
}

Now, let’s get back to the UI (jqxTreeGrid.aspx). Give a title to the page and add the scripts reference as follows:


<head runat="server">
    <title>jqxTreeGrid Demo</title>
    <link href="jqwidgets/styles/jqx.base.css" rel="stylesheet" />
    <script src="scripts/jquery-1.10.2.min.js"></script>
    <script src="jqwidgets/jqxcore.js"></script>
    <script src="jqwidgets/jqxdata.js"></script>
    <script src="jqwidgets/jqxbuttons.js"></script>
    <script src="jqwidgets/jqxscrollbar.js"></script>
    <script src="jqwidgets/jqxdatatable.js"></script>
    <script src="jqwidgets/jqxtreegrid.js"></script>
</head>

Now the main part. Create a script section after those reference declared above and paste this code:


<script>
    $(document).ready(function() {
        function onSuccess(data) {
            var users = data.d;
            var source =
            {
                dataType: "json",
                dataFields: [
                    { name: 'UserType', type: 'string' },
                    { name: 'Name', type: 'string' },
                    { name: 'Phone', type: 'string' },
                    { name: 'CurrentBalance', type: 'number' },
                    { name: 'UserCode', type: 'string' },
                    { name: 'ParentCode', type: 'string' }
                ],
                hierarchy:
                {
                    keyDataField: { name: 'UserCode' },
                    parentDataField: { name: 'ParentCode' }
                },
                id: 'UserCode',
                localData: users

            var dataAdapter = new $.jqx.dataAdapter(s  
            $("#treeGrid").jqxTreeGrid(
            {
                width: 700,
                height: 390,
                source: dataAdapter,
                ready: function () {
                    $("#treeGrid").jqxTreeGrid('expandRow', '2');
                },
                columns: [
                  { text: 'User Type', dataField: 'UserType', width: 150 },
                  { text: 'Name', dataField: 'Name', width: 150 },
                  { text: 'Phone', dataField: 'Phone', width: 200 },
                  { text: 'Current Balance', dataField: 'CurrentBalance', 
                  width: 200, cellsalign: 'right', cellsFormat: "c2" }
                ]
            });

        $.ajax({
            type: "GET",
            url: "jqxTreeGrid.aspx/GetData",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: onSuccess,
            failure: function(response) {
                alert(response.d);
            }
        });
    });
</script>

As you can see at the bottom, I’m initiating an Ajax call to my web method declared in the code behind. Since our backend code will return JSON data only when an HTTP GET is initiated, I set the Ajax request type to GET &. Then we have the URL and returned data type declared. On a success request, we have a callback. The callback function will rearrange the data according to our setting. I leave the rest up to you because it’s easy to understand what’s going on there after having the response data. Just look at the hierarchy property and we will get the point.

And in the HTML, all you need to do is to declare a <div></div> tag with the id of treeGrid like below:


<body>
    <form id="form1" runat="server">
    <div>
     <div id="treeGrid"></div>
    </div>
    </form>
</body> 

So everything is done. Set the jqxTreeGrid.aspx page as default starting page and run. You will get an output like this one.

Points of Interest

Git repository for this example can be found at:

Thanks for reading this post.