執行刪除、改名、插入操作
實現了拖放操作就已經完了最難的部分,但是出於完整性考慮,還應該提供一些更好的基本的編輯功能。下面僅僅用四行代碼就可以實現刪除操作:
[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()
重新命名操作需要更多的一些考慮,你可以調用buildXPathQuery 去尋找那個檔案夾正在被編輯,還有如何確定是哪一個屬性,如何確定被顯示名稱相應的返回結構的元素或者子項目?這是一個誤導的問題,XPath filte函數已經被定義了,你只需應用現面的轉換就可以了:
[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
最後一個挑戰就是如何按照需求建立一個新的檔案夾。query filter 允許使用者用一組檔案夾而不是xml元素操作xml文檔。這樣對你想在那些檔案夾周圍進行移動很有協助的,而且它還可以告訴在哪裡插入一個檔案夾,但是它不能告訴你這個檔案夾應該包含什麼東西,你應該猜測文檔中的所有檔案夾是否含有相同的結構或者內容。但是我們的目標是建立一個不需要任何預定的顯示xml 方法。因此,我選擇將這些怎人委託給應用程式控制。例如,用戶端代碼可以下面這樣寫:
[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 控制項可以緩衝一個結構的副本,將它作為一個臨時變數來建立一個新的檔案夾集合。你所要做的僅僅是確保被定義得檔案夾可以被filter query 識別,否則treeview 將不能顯示它。因為對於我們操作的文檔,xml通常是外部的(external)。在我使用它之前需要匯入到文檔中
[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()