顯示具有 TreeView 標籤的文章。 顯示所有文章
顯示具有 TreeView 標籤的文章。 顯示所有文章

2018年1月19日 星期五

還原TreeView 的展開狀態

例:
 
如果在 A 下的 C 下加入 D,如果只是在 TreeView 上改變顯示,那麼要遍歷整個 Tree,找出所有的 C (B 下有一個 C)之後,改變畫面,雖然可以這樣做,但程式碼上似乎複雜了點
所以改變思路,在 C 下加入 D 之後,重新綁定 TreeView 的資料。

但是重新綁定 TreeView 之後,TreeView 會收合到剩下第一層,使用者就要重新展開之後,再往下加入其他子項目,這點其實很麻煩。

所以在重新綁定前先記錄下目前 TreeView 的展開狀態,綁定之後再還原展開狀態,程式碼加下

設定兩個全域變數
private Dictionary<string, bool> NodesStatus = new Dictionary<string, bool>();  // 記錄展開狀態
private string SelectNodeFullPath = ""; // 記錄選擇到的節點

記錄展開狀態
/// <summary>
/// 記錄展開狀態
/// </summary>
/// <param name="nodes"></param>
private void GetTreeNodesStatus(TreeNodeCollection nodes)
{
 foreach (TreeNode node in nodes)
 {
  if (node.IsExpanded)
  {
   NodesStatus[node.FullPath] = true;
  }
  else
  {
   NodesStatus.Remove(node.FullPath);
  }

  if (node.IsSelected)
  {
   SelectNodeFullPath = node.FullPath;
  }
  GetTreeNodesStatus(node.Nodes);
 }
}

還原展開狀態
/// <summary>
/// 還原展開狀態
/// </summary>
/// <param name="nodes"></param>
private void SetTreeNodesStatus(TreeNodeCollection nodes)
{
 foreach (TreeNode node in nodes)
 {
  if (NodesStatus.ContainsKey(node.FullPath))
  {
   node.Expand();
  }

  if (node.FullPath == SelectNodeFullPath)
  {
   treeView1.SelectedNode = node;
  }

  SetTreeNodesStatus(node.Nodes);
 }
}

使用方式
// 對treeView1做了某些操作之後(例如加入子選項)
GetTreeNodesStatus(treeView1.Nodes);
BindTreeViewData(); // 綁定TreeView
SetTreeNodesStatus(treeView1.Nodes);

2016年12月16日 星期五

ASP.NET TreeView 的資料建立

首先要有一父子架構的資料表

Private void SetTree()
{
    // 取得有父子架構的資料
    DataTable dt = GetData("Select ID, Name, FatherID From MyTable");
    // 跑第一層迴圈建立根節點
    foreach (DataRow row in dt.Rows)
    {
           TreeNode root = new TreeNode(rows["ID"].ToString(), rows["Name"].ToString());
           AddChildNode(dt, root);
           TreeView1.Nodes.Add(root);
    }
}

// 跑遞迴建立子節點
Private void AddChildNode(DataTable dt, TreeNode node)
{
    DataRow[] Rows = dt.Select(string.Format("FatherID = {0}", node.Value));  
    if (rows.Count() > 0)
    {
        foreach (DataRow row in Rows)
        {
            TreeNode newNode = new TreeNode(row["ID"].ToString(), rows["Name"].ToString());
            node.ChildNodes.Add(newNode);
            AddChildNode(dt, newNode);
        }
    }
}