I am using jsTree v1.0 (latest v3.0, they withdraw support from older versions) to display the hierarchy in my application. It was good until until I started showing groups/user up to 200 levels, but now I have a new client which has levels as big as up to 5000, so this code is taking too long to execute. I have two options: either I switch to new plugin (time taking) or optimize the existing code which I am using.
public static List<JsTreeNode> NodeList(DataTable dtMainGroup, DataTable dtMainUser, bool includeUsers)
{
List<JsTreeNode> nodeList = new List<JsTreeNode>();
List<String> LStrGpId = new List<string>();
List<String> LStrChild = new List<string>();
DataView dvGroup = new DataView();
DataView dvUser = new DataView();
dvGroup = dtMainGroup.DefaultView;
dvUser = dtMainUser.DefaultView;
if (dtMainGroup.Rows.Count > 0)
{
for (int i = 0; i < dtMainGroup.Rows.Count; i++)
{
DataRow drMain = dtMainGroup.Rows[i];
if (!LStrGpId.Contains(Convert.ToString(drMain["GroupId"])) && !LStrChild.Contains(Convert.ToString(drMain["GroupId"])))
{
if (i == 0)
{
selectedGroup = Convert.ToString(drMain["GroupId"]);
}
JsTreeNode node = new JsTreeNode();
node.attr = new Attributes();
node.attr.id = Constants.GroupPrefix + Convert.ToString(drMain["GroupId"]);
node.attr.rel = Constants.treeNodeRelFolder;
node.data = new Common.Data();
node.data.title = Convert.ToString(drMain["Name"]);
node.data.state = Constants.treeNodeStateClosed;
LStrGpId.Add(Convert.ToString(drMain["GroupId"]));
node.children = new List<JsTreeNode>();
if (includeUsers)
{
node = GetUser(dvUser, dvGroup, drMain, node);
}
node = GetChild(dvGroup, dvUser, drMain, node, LStrChild, includeUsers);
nodeList.Add(node);
}
}
}
return nodeList;
}
public static JsTreeNode GetUser(DataView dvUsr, DataView dvGp, DataRow dr, JsTreeNode node)
{
dvUsr.RowFilter = "GroupId = '" + Convert.ToString(dr["GroupId"]) + "'";
if (dvUsr.Count > 0)
{
DataTable dtUser = new DataTable();
dtUser = dvUsr.ToTable();
for (int k = 0; k < dtUser.Rows.Count; k++)
{
DataRow drUser = dtUser.Rows[k];
JsTreeNode cnode = new JsTreeNode();
cnode.attr = new Attributes();
cnode.attr.id = Constants.EmployeePrefix + Convert.ToString(drUser["UserID"]);
cnode.attr.rel = Constants.treeNodeRelDefault;
cnode.data = new Common.Data();
cnode.data.title = Convert.ToString(drUser["FirstName"]);
cnode.data.state = Constants.treeNodeStateClosed;
node.children.Add(cnode);
}
}
return node;
}
public static JsTreeNode GetChild(DataView dvGp, DataView dvUsr, DataRow dr, JsTreeNode node, List<string> LStrChild, bool includeUsers)
{
dvGp.RowFilter = "ParentGroupId = '" + Convert.ToString(dr["GroupId"]) + "'";
if (dvGp.Count > 0)
{
DataTable dtChild = new DataTable();
dtChild = dvGp.ToTable();
for (int j = 0; j < dtChild.Rows.Count; j++)
{
DataRow drChild = dtChild.Rows[j];
LStrChild.Add(Convert.ToString(drChild["GroupId"]));
JsTreeNode cnode = new JsTreeNode();
cnode.attr = new Attributes();
cnode.attr.id = Constants.GroupPrefix + Convert.ToString(drChild["GroupId"]);
cnode.attr.rel = Constants.treeNodeRelFolder;
cnode.data = new Common.Data();
cnode.data.title = Convert.ToString(drChild["Name"]);
cnode.data.state = Constants.treeNodeStateClosed;
cnode.children = new List<JsTreeNode>();
if (includeUsers)
{
cnode = GetUser(dvUsr, dvGp, drChild, cnode);
}
cnode = GetChild(dvGp, dvUsr, drChild, cnode, LStrChild, includeUsers);
node.children.Add(cnode);
}
}
return node;
}