Dev TreeList 添加、修改、刪除樹節點時樹狀態保持不變

       使用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();
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章