如何在 Devexpress Virtual Treeview 中维护项目的检查状态?
How to maintain checkstate of items in Devexpress Virtual Treeview?
我有一个在虚拟模式下创建的 Treeview,它有 4 级节点,在页面加载时加载根元素和第一级元素,其余元素将基于使用 treeFolderList_VirtualModeCreateChildren
事件动态加载。
这是我目前所拥有的
protected void treeFolderList_VirtualModeCreateChildren(object source, TreeViewVirtualModeCreateChildrenEventArgs e)
{
List<TreeViewVirtualNode> children = new List<TreeViewVirtualNode>();
if (e.NodeName == null)
{
AppendChildNode(children, "root", "All Domains", false);
}
else
{
if (e.NodeName.Contains("root"))
{
PopulateChildNodes(false, children);
}
else
{
if (!(e.NodeName.StartsWith("u_")))
{
PopulateUserChildNodes(false, children, GetDomainBase(e.NodeName), e.NodeName);
}
else
{
TreeViewVirtualNode tvNode = (TreeViewVirtualNode)treeFolderList.Nodes.FindByName(e.NodeName);
TreeViewVirtualNode tvNodeParent = (TreeViewVirtualNode)tvNode.Parent;
string tvParentNodeName = tvNodeParent.Name;
PopulateUserChildNodes(true, children, GetDomainBase(tvParentNodeName), e.NodeName);
}
}
}
e.Children = children;
}
这按预期工作,并在分别展开节点时创建子元素。我的问题是我有每个节点的复选框,我需要能够以某种方式保存 Treeview
当我 reload/redirect 到页面时它会反映我选择的节点。
有办法实现吗?
有几种方法可以尝试实现这一点:
配置 ASPxTreeList.SettingsCookies 元素(可能是最简单的解决方案),尤其是 StoreSelection 属性:
<dvx:ASPxTreeList ... >
...
<SettingsCookies Enabled="true" StoreSelection="true" />
...
</dvx:ASPxTreeList>
如果 SettingsCookies 不起作用,请尝试使用 ASPxTreeList.ClientLayout 事件手动保存和恢复 TreeList 布局。先定义事件处理器:
<dvx:ASPxTreeList OnClientLayout="dvxTreeList_ClientLayout"... >
...
</dvx:ASPxTreeList>
并按照文档中的示例处理此事件。这样 ASPxTreeView 和 ASPxGridView 就可以在 e.LayoutData
字符串中提供 node/column 格式的数据,可以将其保存到数据库中,然后再恢复回来。
将 TreeView 选定的节点键存储在 Session 中并使用回调恢复它们:
示例:ASPxTreeList - How to store the selection between requests
我个人不会依赖 cookie,会先尝试方法 #2 和 #3。 #2 使用 ASPxGridView 对我来说效果很好,#3 我们在复杂的 ASPxTreeView 设置中使用它,它还跟踪隐藏节点的选择。
我希望链接文档中的示例足够容易让您复制和修改。如果不是,请评论什么不适合你。
HTH
我有一个在虚拟模式下创建的 Treeview,它有 4 级节点,在页面加载时加载根元素和第一级元素,其余元素将基于使用 treeFolderList_VirtualModeCreateChildren
事件动态加载。
这是我目前所拥有的
protected void treeFolderList_VirtualModeCreateChildren(object source, TreeViewVirtualModeCreateChildrenEventArgs e)
{
List<TreeViewVirtualNode> children = new List<TreeViewVirtualNode>();
if (e.NodeName == null)
{
AppendChildNode(children, "root", "All Domains", false);
}
else
{
if (e.NodeName.Contains("root"))
{
PopulateChildNodes(false, children);
}
else
{
if (!(e.NodeName.StartsWith("u_")))
{
PopulateUserChildNodes(false, children, GetDomainBase(e.NodeName), e.NodeName);
}
else
{
TreeViewVirtualNode tvNode = (TreeViewVirtualNode)treeFolderList.Nodes.FindByName(e.NodeName);
TreeViewVirtualNode tvNodeParent = (TreeViewVirtualNode)tvNode.Parent;
string tvParentNodeName = tvNodeParent.Name;
PopulateUserChildNodes(true, children, GetDomainBase(tvParentNodeName), e.NodeName);
}
}
}
e.Children = children;
}
这按预期工作,并在分别展开节点时创建子元素。我的问题是我有每个节点的复选框,我需要能够以某种方式保存 Treeview
当我 reload/redirect 到页面时它会反映我选择的节点。
有办法实现吗?
有几种方法可以尝试实现这一点:
配置 ASPxTreeList.SettingsCookies 元素(可能是最简单的解决方案),尤其是 StoreSelection 属性:
<dvx:ASPxTreeList ... > ... <SettingsCookies Enabled="true" StoreSelection="true" /> ... </dvx:ASPxTreeList>
如果 SettingsCookies 不起作用,请尝试使用 ASPxTreeList.ClientLayout 事件手动保存和恢复 TreeList 布局。先定义事件处理器:
<dvx:ASPxTreeList OnClientLayout="dvxTreeList_ClientLayout"... > ... </dvx:ASPxTreeList>
并按照文档中的示例处理此事件。这样 ASPxTreeView 和 ASPxGridView 就可以在
e.LayoutData
字符串中提供 node/column 格式的数据,可以将其保存到数据库中,然后再恢复回来。将 TreeView 选定的节点键存储在 Session 中并使用回调恢复它们:
示例:ASPxTreeList - How to store the selection between requests
我个人不会依赖 cookie,会先尝试方法 #2 和 #3。 #2 使用 ASPxGridView 对我来说效果很好,#3 我们在复杂的 ASPxTreeView 设置中使用它,它还跟踪隐藏节点的选择。
我希望链接文档中的示例足够容易让您复制和修改。如果不是,请评论什么不适合你。
HTH