使用Dev TreeList時,每當新增、修改、刪除節點時,樹就會閃爍,而且節點的展開狀態混亂,滾動條也亂跳,解決這個問題思路很簡單:
1.操作樹之前保存樹的當前狀態,如節點的展開狀態(只保存展開即可)、當前焦點、當前距頂位置等。
2.操作完樹(調用RefreshDataSource)後,重新設置樹的狀態。
重點:爲了讓整個操作過程中樹不閃爍,切記,一次操作只能對樹的狀態保持一次,加載一次,保持和記載之間只能調用一次樹的刷新RefreshDataSource.
貼上樹狀態的保存加載類:
public class TreeListViewState
{
private List<string> expandNodeList;
private string focusedId;
private TreeListNode preNode;
private int topIndex;
private Stack<bool> stateStack;
public TreeListViewState() : this(null) { }
public TreeListViewState(TreeList treeList)
{
this.treeList = treeList;
expandNodeList = new List<string>();
stateStack = new Stack<bool>();
}
public bool IsRefreshing { get; set; } = false;
public void Clear()
{
expandNodeList.Clear();
stateStack.Clear();
focusedId = string.Empty;
preNode = null;
topIndex = 0;
}
private void GetExpanded()
{
expandNodeList.Clear();
foreach (var node in TreeList.GetNodeList())
{
if (node.HasChildren && node.Expanded)
{
expandNodeList.Add(node.GetValue("Id")?.ToString());
}
}
expandNodeList.RemoveAll(o => string.IsNullOrEmpty(o));
}
private ArrayList GetSelected()
{
ArrayList al = new ArrayList();
foreach (TreeListNode node in TreeList.Selection)
al.Add(node.GetValue(TreeList.KeyFieldName));
return al;
}
public void LoadState()
{
try
{
if (!stateStack.Pop())
return;
IsRefreshing = false;
foreach (TreeListNode item in TreeList.GetNodeList())
{
if(expandNodeList.Contains(item.GetValue("Id")?.ToString()))
{
item.Expanded = true;
}
else
{
item.Expanded = false;
}
}
var focusedNode = TreeList.FindNodeByFieldValue("Id", focusedId);
if(focusedNode == null)
{
TreeList.FocusedNode = preNode;
}
else
{
TreeList.FocusedNode = TreeList.FindNodeByFieldValue("Id", focusedId);
}
}
finally
{
TreeList.TopVisibleNodeIndex = TreeList.GetVisibleIndexByNode(TreeList.FocusedNode) - topIndex;
TreeList.EndUpdate();
}
}
public void SaveState()
{
if(stateStack.Count == 0)
{
stateStack.Push(true);
}
else
{
stateStack.Push(false);
return;
}
TreeList.BeginUpdate();
if (TreeList.FocusedNode != null)
{
GetExpanded();
focusedId = TreeList.FocusedNode.GetValue("Id")?.ToString();
preNode = TreeList.FocusedNode.PrevNode == null ? TreeList.FocusedNode.ParentNode : TreeList.FocusedNode.PrevNode;
topIndex = TreeList.GetVisibleIndexByNode(TreeList.FocusedNode) - TreeList.TopVisibleNodeIndex;
IsRefreshing = true;
}
else
{
Clear();
}
}
private TreeList treeList;
public TreeList TreeList
{
get
{
return treeList;
}
set
{
treeList = value;
Clear();
}
}
}