//tương tự như Recursive_ToString_1 thay vì nối từng đoạn string về một node khi kết thúc hàm vào biến nodesString, thì Recursive_ToString_2 return đoạn string của node đó mỗi khi kết thúc hàm //so về tốc độ thì Recursive_ToString_2 chậm hơn Recursive_ToString_1 nhưng linh hoạt hơn nên nó được để public public static string Recursive_ToString_2(TreeNode node) { string returnString = ""; n++; WindowsForm.Loading.Update(n + " - " + node.Text, 1); // "name \bcontent \ccolor \ddate \iis_lockNode \nnodes \e" //lưu ý: đối với các thành phần có thể chứa ký tự "\" thì phải replace \ sang \\. Ví dụ như: name, content,... //mã hoá nội dung với node đang ở trạng thái mở string content = node.Name; if (((Tag_of_Node)node.Tag).is_lockNode && ((Tag_of_Node)node.Tag).unlocked) { content = Encoding.Default.GetString(AdvancedEncryptionStandard.Encoding(checkingCode + node.Name, ((Tag_of_Node)node.Tag).password)); } //nối chuỗi các thuộc tính của node returnString += node.Text.Replace(@"\", @"\\") + @" \b" + content.Replace(@"\", @"\\") + @" \c" + node.ForeColor.ToArgb() + @" \d" + ((Tag_of_Node)node.Tag).date + @" \i" + ((Tag_of_Node)node.Tag).is_lockNode.ToString() + @" \n"; //nếu không phải là một node bình thường if (((Tag_of_Node)node.Tag).is_lockNode) { //nếu node này đang khoá if (!((Tag_of_Node)node.Tag).unlocked) { return(returnString + ((Tag_of_Node)node.Tag).nodes.Replace(@"\", @"\\") + @" \e"); } //nếu node này đang mở else { string lockNodesString = ""; if (node.Nodes != null && node.Nodes.Count > 0) { foreach (TreeNode a_node in node.Nodes) { lockNodesString += Recursive_ToString_2(a_node); } } byte[] bytes = ((Tag_of_Node)node.Tag).password; return(returnString + Encoding.Default.GetString(AdvancedEncryptionStandard.Encoding(lockNodesString, bytes)).Replace(@"\", @"\\") + @" \e"); } } //nếu là một node bình thường else { if (node.Nodes != null && node.Nodes.Count > 0) { foreach (TreeNode a_node in node.Nodes) { returnString += Recursive_ToString_2(a_node); } } return(returnString + @" \e"); } }
//khoá node đang mở public static void SaveAndLockAUnlockedNode(TreeNode node) { //mã hoá nội dung node.Name = Encoding.Default.GetString(AdvancedEncryptionStandard.Encoding(checkingCode + node.Name, ((Tag_of_Node)node.Tag).password)); //đưa các nodes con về chuỗi để mã hoá string nodesString = ""; foreach (TreeNode a_node in node.Nodes) { nodesString += Recursive_ToString_2(a_node); } node.Nodes.Clear(); //mã hoá các nodes con ((Tag_of_Node)node.Tag).nodes = Encoding.Default.GetString(AdvancedEncryptionStandard.Encoding(nodesString, ((Tag_of_Node)node.Tag).password)); ((Tag_of_Node)node.Tag).password = null; ((Tag_of_Node)node.Tag).unlocked = false; }