Move SiteMapNode to top of list

107 Views Asked by At

I have System.Web.SiteMapProvider and I get all tree (nodes) using providerSiteMap.RootNode.ChildNodes

For childnodes from RootNode, I want move the last node to the top (as first item).

ChildNodes: N1, N2, ... N9, N10 

I want move last node N10:

ChildNodes: N10, N1, N2, ...N9 

I try this:

        var providerSiteMap = GetProviderSiteMap(sRoles);
        var dSource = new SiteMapDataSource { Provider = providerSiteMap };
        var nodeList = providerSiteMap.GetChildNodes(providerSiteMap.RootNode);

        var listaNodos = new List<SiteMapNode>();
        var item = providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().FirstOrDefault(x => x.Key == "9100");

        providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Remove(item);
        providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Insert(0, item);


        dSource.DataBind();
        //enlazamos

        TreeView1.DataSource = dSource;
        TreeView1.DataBind();

and I try:

var item = providerSiteMap.RootNode.ChildNodes.Cast().FirstOrDefault(x => x.Key == "9100");

        var t = providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Count;
        providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Remove(item);
        t = providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Count;
        providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().ToList().Insert(0, item);

ToList().Count is the same before and after Remove(item)

and I try:

 var item = providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().FirstOrDefault(x => x.Key == "9100");
 var t = providerSiteMap.RootNode.ChildNodes.Count;
 providerSiteMap.RootNode.ChildNodes.Remove(item);
 t = providerSiteMap.RootNode.ChildNodes.Count;
 providerSiteMap.RootNode.ChildNodes.Insert(0, item);
 t = providerSiteMap.RootNode.ChildNodes.Count;

and I get Collection is read-only error when I try execute providerSiteMap.RootNode.ChildNodes.Remove(item);

Any suggestions?

1

There are 1 best solutions below

0
Kiquenet On

I try this:

        var providerSiteMap = GetProviderSiteMap(sRoles);
        var dSource = new SiteMapDataSource { Provider = providerSiteMap };
        var nodeList = providerSiteMap.GetChildNodes(providerSiteMap.RootNode);

        var listaNodos = new List<SiteMapNode>();
        var item = providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>().FirstOrDefault(x => x.Key == "9100");

        List<SiteMapNode> children2 = new List<SiteMapNode>(providerSiteMap.RootNode.ChildNodes.Cast<SiteMapNode>());

        var t = children2.Count;
        children2.Remove(item);
        t = children2.Count;
        children2.Insert(0, item);
        t = children2.Count;

        var nodesChildren = new SiteMapNodeCollection(children2.ToArray());
        providerSiteMap.RootNode.ChildNodes = nodesChildren;

        // refresh ??
        providerSiteMap.GetChildNodes(providerSiteMap.RootNode);