執(zhí)行刪除、改名、插入操作 實現(xiàn)了拖放操作就已經(jīng)完了最難的部分,但是出于完整性考慮,還應(yīng)該提供一些更好的基本的編輯功能。下面僅僅用四行代碼就可以實現(xiàn)刪除操作: [C#] string xpath_query = buildXPathQuery(this.SelectedNode); System.Xml.XmlNode node = xml_document.DocumentElement.SelectSingleNode( xpath_query); node.ParentNode.RemoveChild(node); SelectedNode.Remove();
[VB] Dim xpath_query As String = _ buildXPathQuery(Me.SelectedNode) Dim node As System.Xml.XmlNode = _ xml_document.DocumentElement.SelectSingleNode( _ xpath_query) node.ParentNode.RemoveChild(node) SelectedNode.Remove() 重命名操作需要更多的一些考慮,你可以調(diào)用buildXPathQuery 去查找那個文件夾正在被編輯,還有如何確定是哪一個屬性,如何確定被顯示名稱相應(yīng)的返回結(jié)構(gòu)的元素或者子元素?這是一個誤導(dǎo)的問題,XPath filte函數(shù)已經(jīng)被定義了,你只需應(yīng)用現(xiàn)面的轉(zhuǎn)換就可以了: [C#] private void XmlTreeView_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e) { string xpath_query = buildXPathQuery(e.Node); System.Xml.XmlNode node = xml_document.DocumentElement.SelectSingleNode( xpath_query); System.Xml.XmlNode label = node.SelectSingleNode(xpath_filter); label.Value = e.Label; }
[VB] Private Sub XmlTreeView_AfterLabelEdit( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) _ Handles MyBase.AfterLabelEdit Dim xpath_query As String = buildXPathQuery(e.Node) Dim node As System.Xml.XmlNode = _ xml_document.DocumentElement.SelectSingleNode( _ xpath_query) Dim label As System.Xml.XmlNode = node.SelectSingleNode(xpath_filter) label.Value = e.Label End Sub 最后一個挑戰(zhàn)就是如何按照需求創(chuàng)建一個新的文件夾。query filter 允許用戶用一組文件夾而不是xml元素操作xml文檔。這樣對你想在那些文件夾周圍進行移動很有幫助的,而且它還可以告訴在哪里插入一個文件夾,但是它不能告訴你這個文件夾應(yīng)該包含什么東西,你應(yīng)該猜測文檔中的所有文件夾是否含有相同的結(jié)構(gòu)或者內(nèi)容。但是我們的目標是創(chuàng)建一個不需要任何預(yù)定的顯示xml 方法。因此,我選擇將這些怎人委托給應(yīng)用程序控制。例如,客戶端代碼可以下面這樣寫: [C#] System.Xml.XmlDocument insert_fragment = new System.Xml.XmlDocument(); insert_fragment.LoadXml( "<product id='New Item'>" + "<description/><ordercode/><price/>" + "<image/></product>"); // The TreeView uses XmlInsertionNode to add // a new folder to the tree's underlying XML // document on request xmlTreeView1.XmlInsertionNode = insert_fragment.DocumentElement;
[VB] Dim insert_fragment As New System.Xml.XmlDocument() insert_fragment.LoadXml(" & _ "<product id='New Item'>" & _ "<description/><ordercode/>"<price/>" & _ "<image/></product>") xmlTreeView1.XmlInsertionNode = _ insert_fragment.DocumentElement treeview 控件可以緩存一個結(jié)構(gòu)的副本,將它作為一個臨時變量來創(chuàng)建一個新的文件夾集合。你所要做的僅僅是確保被定義得文件夾可以被filter query 識別,否則treeview 將不能顯示它。因為對于我們操作的文檔,xml通常是外部的(external)。在我使用它之前需要導(dǎo)入到文檔中 [C#] // First you need to clone the node template, and // import it, because it originates from a different // document System.Xml.XmlNode copy_node = new_node.Clone(); System.Xml.XmlNode insert_node = xml_document.ImportNode(copy_node, true); // Next locate which node should be its parent, and // insert it string xpath_query = buildXPathQuery(this.SelectedNode); System.Xml.XmlNode node = xml_document.DocumentElement.SelectSingleNode( xpath_query); node.AppendChild(insert_node); // Finally, apply the xpath filter to determine what // to display System.Xml.XmlNode expr = insert_node.SelectSingleNode(xpath_filter); System.Windows.Forms.TreeNode new_child = SelectedNode.Nodes.Add(expr.Value); populateTreeControl(insert_node, new_child.Nodes); // Select the node, to force the tree to expand SelectedNode = new_child; // And start editing the new folder name suppress_label_edit = false; new_child.BeginEdit();
[VB] ' First you need to clone the node template, and ' import it, because it originates from a different ' document. Dim copy_node As System.Xml.XmlNode = new_node.Clone() Dim insert_node As System.Xml.XmlNode = _ xml_document.ImportNode(copy_node, True) ' Next locate which node should be its parent, ' and insert it Dim xpath_query As String = _ buildXPathQuery(Me.SelectedNode) Dim node As System.Xml.XmlNode = xml_document.DocumentElement.SelectSingleNode( _ xpath_query) node.AppendChild(insert_node) ' Finally, apply the xpath filter to determine what ' should be ' displayed Dim expr As System.Xml.XmlNode = _ insert_node.SelectSingleNode(xpath_filter) Dim new_child As System.Windows.Forms.TreeNode = _ SelectedNode.Nodes.Add(expr.Value) populateTreeControl(insert_node, new_child.Nodes) ' Select the node, to force the tree to expand SelectedNode = new_child ' And start editing the new folder name suppress_label_edit = False new_child.BeginEdit()
|