【问题标题】:Delete all child data based on parent node id in tree根据树中的父节点id删除所有子数据
【发布时间】:2017-11-08 21:38:28
【问题描述】:

我正在使用 kentico 应用程序,我必须删除所有包含父节点 ID 或父节点 ID 的子项,基于其中的子项。 下面是截图:

在这张图片中,我们可以看到我们有一个名为 members 的父节点和一个名为 Blog 的子节点。在博客下,节点 ID 为 583,有 29 个子节点。现在我正在运行一个代码并将该父级下的所有子数据作为列表获取。 下面是屏幕截图:

现在我必须从列表中删除其 parentnodeid 或 parent-parent 节点 id 为 583 的所有子数据(博客)。

下面是用于获取所有父项和子项列表的代码:

 TreeProvider tree = new TreeProvider();
    var childNodeDataSet = tree.SelectNodes(childNodeId, null, SiteContext.CurrentSiteName);
    var getAllChildItems = childNodeDataSet.Items[0].AllChildren;
    var getItems = getAllChildItems.ToList().OrderBy(a=>a.NodeAliasPath);
正如我们在上面的代码中看到的,childNodeId 只不过是 Membership 页面节点 ID。使用这个我得到所有的子项目。 现在,在这个 getItems 中,我拥有了必须完全删除博客页面父级和子级的所有值。

我尝试使用此代码从列表中删除匹配的父项:

 string excludeFileName = "583, 683, 686, 687";
                    string[] arrStringList = excludeFileName.Split(',');
                    foreach (var excName in arrStringList)
                    {
                        getItems.RemoveAll(a => (a.NodeID == Convert.ToInt32(excName.Trim()) || a.NodeParentID == Convert.ToInt32(excName.Trim()))
                        || (a.Parent.NodeID == Convert.ToInt32(excName.Trim()) || a.Parent.NodeParentID == Convert.ToInt32(excName.Trim()))
                        || (a.Parent.Parent.NodeID == Convert.ToInt32(excName.Trim()) || a.Parent.Parent.NodeParentID == Convert.ToInt32(excName.Trim()))
                        || (a.Parent.Parent.Parent.NodeID == Convert.ToInt32(excName.Trim()) || a.Parent.Parent.Parent.NodeParentID == Convert.ToInt32(excName.Trim())));
                    }

如果我知道特定节点有多少级别,则此代码可以正常工作。

但是,如果某些节点没有那么高的级别,那么在这种情况下,此代码将给出异常。

如果发现任何问题,请告诉我。

【问题讨论】:

  • 您提供的内容“看起来不错”。您可能想要发布的是您的代码,以便对其进行审查,以确保您正确使用 API 调用。
  • 我已经编辑了我的问题并添加了代码以了解列表是如何生成的。我还添加了用于删除节点的代码。
  • 那么具体的问题是什么?

标签: asp.net treeview kentico


【解决方案1】:

我对你走的路有点困惑。如果要获取特定节点的所有子节点,为什么不直接获取 NodeAliasPath 为 "The/Parent/Node/Path"+"/%" 的所有节点?

这将一直选择所有子节点。

如果只想抓取一定数量的level,可以获取Parent的NodeLevel,然后在查询中添加NodeLevel <= "+(ParentNodeLevel+2),只抓取所有的子孙。

要排除某些节点,您还可以输入“NodeID not in (123,234)”。

也许如果您能清楚地说明您想要完成的工作,我们可以更轻松地提供帮助!

PS:我放的是 SQL,但是 DocumentQuery 对象大部分都在方法中,比如.WhereNotIn("NodeID", ListOfNodeIDsToExclude)

【讨论】:

  • 通过 NodeAliasPath 我可以从列表中删除项目。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多