我正在尝试从下面的字符串中准备树视图控件。
"US|New York|D.M.Street"
"US|New York|ShoppingMall"
"INDIA|Dehli|G.M. Road"
"INDIA|Mumbai|Harbour Street"
"US|Washington|WhiteHouse"
"INDIA|Dehli|Rajpath"
"INDIA|Mumbai|CST"
我想在C#中填充此集合中的树视图。以下列方式
Country
|
US => NewYork ==========>D.M.Street
| | ==========>ShoppingMall
|
| Washinton==========>WhiteHouse
|
INDIA=>Dehli ==========>G.M. Road
| ==========>Rajpath
|
Mumbai ==========>CST
==========>Harbour Street
我怎么准备这个?用户收集还是其他方式?
答案 0 :(得分:1)
以下是我如何做到这一点:
创建一个类和一个集合来保存元素的嵌套层次结构(如果需要更多细节,可以在以后扩展)。
public class Element
{
public Element(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
public ElementCollection Children = new ElementCollection();
// This method is used to add the specified child name if it does not currently
// exist, or return the existing one if it does
public Element AddOrFetchChild(string sName)
{
Element oChild;
if (this.Children.ContainsKey(sName))
{
oChild = this.Children[sName];
}
else
{
oChild = new Element(sName);
this.Children.Add(sName, oChild);
}
return oChild;
}
}
public class ElementCollection : System.Collections.Generic.Dictionary<string, Element>
{
}
然后将您的数据解析到集合中(请注意,这将支持您的记录结构中的任何级别的嵌套,而无需修改代码):
string[] asLines;
// ToDo: Add code here to populate the collection of lines to process
// Create a base element that makes popuplation of the elements easier
Element BaseElement = new Element("");
// Cycle through each of the lines
foreach (string sLine in asLines())
{
// Get the components out of the line
string[] asElements = sLine.Split("|");
// Starting with the base element
Element oParentElement = BaseElement;
// Cycle through each of the elements that were found, adding the current value to the parent's
// collection of children, then using the new or found item as the parent for the next item in the list
for (int nI = 0; nI < asElements.Length; nI++)
{
oParentElement = oParentElement.AddOrFetchChild(asElements[nI]);
}
}
// Finally, add the nodes to the tree recursively
AddNodesToTree(BaseElement.Children, this.treeView1.Nodes);
这是用于将项添加到树
的递归方法 /// <summary>
/// A recursive method to add all of the records to the specified collection of nodes
/// </summary>
/// <param name="cRecords"></param>
/// <param name="cNodes"></param>
private void AddNodesToTree(ElementCollection cRecords, TreeNodeCollection cNodes)
{
foreach (Element oRecord in cRecords.Values)
{
TreeNode oNode = new TreeNode();
oNode.Text = oRecord.Name;
oNode.Tag = oRecord;
cNodes.Add(oNode);
// Now add the node's children if any
if (oRecord.Children.Count != 0)
{
AddNodesToTree(oRecord.Children, oNode.Nodes);
}
}
}
答案 1 :(得分:1)
给定GetData()
函数返回IEnumerable<string>
所有字符串数据,并假设您想要混杂的LINQ:
var nodes = GetData().Select(data => data.Split('|')).GroupBy(x => x[0]).Select(
country => new TreeNode(country.Key, country.GroupBy(x => x[1]).Select(
city => new TreeNode(city.Key, city.Select(
place => new TreeNode(place[2]))
.ToArray()))
.ToArray()))
.ToArray();
treeView1.Nodes.AddRange(nodes);
请注意,这并未考虑样本数据中“纽约”和“孟买”的拼写不一致,我已在样本中对其进行了更正。