我創建了一個 TreeView,其中一些節點將 Tag 屬性設定為一個Machine包含 IP 地址、FQDN 和友好名稱的物件strings
我可以保留 TreeView,在使用 XML 重新加載程式時保持樹的結構。但是,標簽值只是Project.Machine并且顯然不包含資料。
該程式的作業原理是要求用戶將資料輸入文本框,然后將文本框創建到機器物件中,然后系結到選定節點的 Tag 屬性。
我應該先實作類,然后在程式啟動時將 Tag 屬性添加到節點嗎?
這是持久化 TreeView 的類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace PRTG_Ripoff
{
internal class TreeViewSerializer
{
// Constants
// Xml tag for node
private const string XmlNodeTag = "node";
// Xml attributes for node
private const string XmlNodeTextAtt = "text";
private const string XmlNodeTagAtt = "tag";
private const string XmlNodeImageIndexAtt = "imageindex";
public void DeserializeTreeView(TreeView tv, string filename)
{
XmlTextReader reader = null;
try
{
// disable re-drawing of tree view till nodes are added
tv.BeginUpdate();
reader = new XmlTextReader(filename);
TreeNode parentNode = null;
while(reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == XmlNodeTag)
{
TreeNode newNode = new TreeNode();
bool isEmptyElement = reader.IsEmptyElement;
// loading node attributes
int attributeCount = reader.AttributeCount;
if (attributeCount > 0)
{
for (int i = 0; i < attributeCount; i )
{
reader.MoveToAttribute(i);
SetAttributeValue(newNode,
reader.Name, reader.Value);
}
}
// add new node to Parent Node or TreeView
if (parentNode != null)
parentNode.Nodes.Add(newNode);
else
tv.Nodes.Add(newNode);
// making current node 'ParentNode' if its not empty
if (!isEmptyElement)
{
parentNode = newNode;
}
}
}
// moving up to in TreeView if end tag is encountered
else if (reader.NodeType == XmlNodeType.EndElement)
{
if (reader.Name == XmlNodeTag)
{
parentNode = parentNode.Parent;
}
}
else if (reader.NodeType == XmlNodeType.XmlDeclaration)
{
//Ignore Xml Declaration
}
else if (reader.NodeType == XmlNodeType.None)
{
return;
}
else if (reader.NodeType == XmlNodeType.Text)
{
parentNode.Nodes.Add(reader.Value);
}
}
}
finally
{
// enabling redrwaing of treeview
tv.EndUpdate();
reader.Close();
}
}
/// Used by Deserialize method for setting properties of
/// TreeNode from xml node attributes
private void SetAttributeValue(TreeNode node,
string propertyName, string value)
{
if (propertyName == XmlNodeTextAtt)
{
node.Text = value;
}
else if (propertyName == XmlNodeImageIndexAtt)
{
node.ImageIndex = int.Parse(value);
}
else if (propertyName == XmlNodeTagAtt)
{
node.Tag = value;
}
}
public void SerializeTreeView(TreeView treeView, string fileName)
{
XmlTextWriter textWriter = new XmlTextWriter(fileName,
System.Text.Encoding.ASCII);
// writing the xml declaration tag
textWriter.WriteStartDocument();
//textWriter.WriteRaw("\r\n");
// writing the main tag that encloses all node tags
textWriter.WriteStartElement("TreeView");
// save the nodes, recursive method
SaveNodes(treeView.Nodes, textWriter);
textWriter.WriteEndElement();
textWriter.Close();
}
private void SaveNodes(TreeNodeCollection nodesCollection, XmlTextWriter textWriter)
{
for (int i = 0; i < nodesCollection.Count; i )
{
TreeNode node = nodesCollection[i];
textWriter.WriteStartElement(XmlNodeTag);
textWriter.WriteAttributeString(XmlNodeTextAtt,
node.Text);
textWriter.WriteAttributeString(
XmlNodeImageIndexAtt, node.ImageIndex.ToString());
if (node.Tag != null)
textWriter.WriteAttributeString(XmlNodeTagAtt,
node.Tag.ToString());
// add other node properties to serialize here
if (node.Nodes.Count > 0)
{
SaveNodes(node.Nodes, textWriter);
}
textWriter.WriteEndElement();
}
}
}
}
以及我如何創建物件
private void Details_Btn_Click(object sender, EventArgs e)
{
// If the text boxes aren't empty
if (FQDN_Txt.Text != "" && IP_Txt.Text != "" && Name_Txt.Text != "")
{
if(mainTree.SelectedNode == null)
{
// If no node is selected
MessageBox.Show("Select a node!");
} else
{
// Create new machine object using data from the text boxes
Machine machine = new Machine(FQDN_Txt.Text, Name_Txt.Text, IP_Txt.Text);
// Set the tag as the machine object
mainTree.SelectedNode.Tag = machine;
}
} else
{
MessageBox.Show("these are empty mate");
}
}
以及我如何從Tag屬性中檢索資料
private void mainTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
mainTree.SelectedNode = e.Node;
TreeNode tn = mainTree.SelectedNode;
infoPanel.Visible = true;
MachineName_lbl.Text = tn.Text;
if (mainTree.SelectedNode.Tag != null)
{
IP_Lbl.Text = ((Machine)mainTree.SelectedNode.Tag).MachineIP;
}
}
uj5u.com熱心網友回復:
由于您當前沒有在其他任何地方使用 Machine 物件實體,因此與其創建一個完整的實體并將其保存在其中,Tag您還可以創建一個TupleorKeyValuePair并將其保存在Tag.
然后,當您將節點寫入SaveNodes. (然后再次閱讀并創建并添加Tuple/ KeyValuePair)。
如果您以后需要使用 Machine 物件,那么您只需序列化密鑰,然后從您的Machine. 在需要時執行此操作,或者在創建 Treeview 節點(并將其分配給標記)時執行此操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510116.html
標籤:C#形式树视图
上一篇:單選按鈕-導致失敗的動態值
下一篇:如何根據選定的單選按鈕計算總價
