通过动态创建的控件中的持久性来维护可见性设置

时间:2010-07-22 20:51:46

标签: c# .net dynamic user-controls

我有一个复杂的自定义用户控件,在C#.NET中创建,它本质上是一个树结构。控件ctlGroup包含字段列表(也是自定义用户控件 - ctlFields)和子组列表。包含子组的datalist创建相同ctlGroup控件的新实例,因为每个子项都可以有一个字段列表和一个子列表,依此类推。呼。

每个组可以拥有的子项数是有限的,并且每个子组都是数据库中的条目,因此无法进行无限递归。控件创建正常,显示正常,直到发生回发。我已经能够在回发后很好地保留与每个动态创建的控件有关的所有数据,但有一个例外。我遇到问题的部分是通过回发保持控件上某些面板的可见性。每个儿童组都有一个按钮,可以扩展和折叠身体的一部分。我可以将此部分折叠一次,但是一旦我再次单击该按钮(即导致回发),控件将保持不变,之前的可见性设置将丢失。

我似乎在努力想出一种存储这些信息的方法。我尝试在viewstate中保存可见性的状态,但是当重新创建控件时,这些信息似乎不会继续存在。

有没有人对如何做到这一点有任何想法?我错过了什么吗?

编辑:我应该澄清,在数据列表中创建的ctlGroup控件是动态创建的,因为它们是递归调用。我不知道从其自身调用控件的任何其他方式,但如果这是一个更好的方法,我很乐意听到它。

1 个答案:

答案 0 :(得分:0)

我的建议:

将“扩展”选项的ID存储在隐藏字段中。他们也可以递归地链接到扩展的孩子。这将是您的“扩展节点”树结构。在JSON中它看起来像这样(在隐藏字段中存储为字符串):

[{
    id: "root1", 
    children: [{id: "sub-root1", children: []}, {id: "sub-root2", children: []}]
 },
 {
    id: "root2",
    children: []
 }]

然后在回发时,在document.load事件($addHandler(document, "load", function (){ ... })上附加一个解析器来解析隐藏字段的JSON。当迭代器访问展开的节点时,它会“点击”实际的展开按钮(在找到的元素上调用.click())。这将重新构建“扩展”结构。

HTH