In my below code , I have a list of AccessId, that is store in tag of nodes of tree.
How can I checked nodes (or childnodes) that tag of them is in my list ?
List<AccessFieldSet> AccessList = new List<AccessFieldSet>();
private void GetRolesAccessData(Int32 RolesId)
{
C_RolesUsers Db = new C_RolesUsers();
AccessList = Db.GetRolesAccessData(RolesId);
foreach (AccessFieldSet Afs in AccessList)
{
foreach (TreeNode node in TreeRoles.Nodes)
{
if (node.Tag == Afs.AccessId.ToString())
{
//Check Node is true ?
}
GetTagChildren(node);
}
}
}
private void GetTagChildren(TreeNode Node)
{
TreeNode ChNode = null;
//TreeFieldSet nodeCat = (TreeFieldSet)Node.Tag;
//Int32 nodeCat = (Int32)Node.Tag;
foreach (AccessFieldSet Afs in AccessList)
{
if (Afs.AccessId.ToString() == Node.Tag)
{
//Check Node is true ?
GetTagChildren(ChNode);
}
}
}
I edit my code to :
List<AccessFieldSet> AccessList = new List<AccessFieldSet>();
private void GetRolesAccessData(Int32 RolesId)
{
C_RolesUsers Db = new C_RolesUsers();
AccessList = Db.GetRolesAccessData(RolesId);
for (int i = 0; i < TreeRoles.Nodes.Count; i++)
{
CheckedSelectedNodes(i, TreeRoles.Nodes, AccessList);
}
}
private void CheckedSelectedNodes(Int32 i, TreeNodeCollection nodes, List<AccessFieldSet> AccessList)
{
TreeNode node = nodes[i];
for (int j = 0; j < AccessList.Count; j++)
{
foreach (AccessFieldSet Afs in AccessList)
{
if ((int)node.Tag == Afs.AccessId)
{
node.Checked = true;
}
}
}
}
With new code, I can checked nodes that node’s tag is in AccessList. How can I change code for ChildNodes(Childs of nodes)?
You can use recursion to do this quite elegantly.
If you find yourself doing this sort of thing often, you can factor out the recursion into a utility method and use Action to just vary the “act-on-each-node” logic. For example:
Then your code just looks like this:
And finally, you could go crazy with LINQ and write your app-specific code in a declarative style: