我有一个 DevExpress Treelist,它的 DataSource 是一个对象列表。我将新项目添加到列表中,然后使用这段代码刷新 Treelist DataSourcetreelist1.RefreshDataSource();
刷新所有展开和选定的节点后,将崩溃,这很烦人。刷新数据源后如何获取 TreeList 的状态?
问问题
779 次
2 回答
3
建议大家看看下面的例子: 刷新数据时如何保存TreeList节点的展开状态 主要思路是保存刷新数据前TreeList的状态,加载之后的状态。
于 2019-04-15T06:52:58.643 回答
2
流此代码:
public class TreeListViewState
{
private ArrayList expanded;
private ArrayList selected;
private object focused;
private int topIndex;
public TreeListViewState()
: this(null)
{
}
public TreeListViewState(TreeList treeList)
{
this.treeList = treeList;
expanded = new ArrayList();
selected = new ArrayList();
}
public void Clear()
{
expanded.Clear();
selected.Clear();
focused = null;
topIndex = 0;
}
private ArrayList GetExpanded()
{
var op = new OperationSaveExpanded();
TreeList.NodesIterator.DoOperation(op);
return op.Nodes;
}
private ArrayList GetSelected()
{
var al = new ArrayList();
foreach (TreeListNode node in TreeList.Selection)
{
al.Add(node.GetValue(TreeList.KeyFieldName));
}
return al;
}
public void LoadState()
{
TreeList.BeginUpdate();
try
{
// TreeList.CollapseAll();
TreeListNode node;
foreach (object key in expanded)
{
node = TreeList.FindNodeByKeyID(key);
if (node != null)
{
node.Expanded = true;
}
}
foreach (object key in selected)
{
node = TreeList.FindNodeByKeyID(key);
if (node != null)
{
TreeList.Selection.Add(node);
}
}
TreeList.FocusedNode = TreeList.FindNodeByKeyID(focused);
}
finally
{
TreeList.EndUpdate();
TreeList.TopVisibleNodeIndex = TreeList.GetVisibleIndexByNode(TreeList.FocusedNode) - topIndex;
}
}
public void SaveState()
{
if (TreeList.FocusedNode != null)
{
expanded = GetExpanded();
selected = GetSelected();
focused = TreeList.FocusedNode[TreeList.KeyFieldName];
topIndex = TreeList.GetVisibleIndexByNode(TreeList.FocusedNode) - TreeList.TopVisibleNodeIndex;
}
else
{
Clear();
}
}
private TreeList treeList;
public TreeList TreeList
{
get
{
return treeList;
}
set
{
treeList = value;
Clear();
}
}
private class OperationSaveExpanded : TreeListOperation
{
private ArrayList al = new ArrayList();
public override void Execute(TreeListNode node)
{
if (node.HasChildren && node.Expanded)
{
al.Add(node.GetValue(node.TreeList.KeyFieldName));
}
}
public ArrayList Nodes
{
get
{
return al;
}
}
}
}
于 2019-04-16T05:03:00.320 回答