我正在尝试阅读一个文本文档,该文档基本上分为信息的“段落”,所有信息都具有相同格式的标题。
目标是将每个标题标题作为父标题添加到treeView
,将其余标题信息添加为treeView
的子标题。
添加标题很容易,但是我在将子项添加到正确的父项时遇到了问题。我正在使用StreamReader
读取每一行,找到“段落”的开头并创建父级。我需要添加的孩子将在接下来的三行中出现。如何从StreamReader's
ReadLine()
获取当前线?或者有更好的方法吗?
using (var sr = new StreamReader(file))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//Sheet name
if (line.Contains("Sheet Name"))
{
string parentNodeName = line.Split('=')[1].Trim();
//Add Parent
treeView.Nodes.Add(parentNodeName);
//Add children, on next 3 lines
treeView.Nodes[parentNodeName].Nodes.Add("Child-1 Text"); //on next line
treeView.Nodes[parentNodeName].Nodes.Add("Child-2 Text"); //on next next line
treeView.Nodes[parentNodeName].Nodes.Add("Child-3 Text"); //etc
}
}
sr.Close();
sr.Dispose();
}
文件中的示例文本(“段落”标题):
800: Sheet Name = Sheet3
999 : Process = 2
1000 : Material = AL,CR,STEEL
1001 : Cut Quality = 0,1,2,3,4,5,6,7,8
我将解析这些行以添加到树中,将子节点添加到相同的父节点。像:
Sheet3
2
AL,CR,STEEL
0,1,2,3,4,5,6,7,8
SS
0,1,2,3,4,5,6,7,8
MS
0,1,2,3,4,5
4
AL,CR,STEEL
0,1,2,3,4,5,6,7,8
MS
0,1,2,3,4,5
10
AL,CR,STEEL
0,1,2,3,4,5,6,7,8
SS
0,1,2,3,4,5,6,7,8
答案 0 :(得分:4)
以下是如何读取文件和构建TreeView的示例。
using (var reader = new StreamReader(file))
{
while (!reader.EndOfStream)
AddParagraphToTree(ReadParagraph(reader));
}
坦率地说,最好将这两个操作分开 - 解析文件和构建树。但是快速的样品会去。还要考虑在使用块结束时自动调用Dispose()。
private class Paragraph
{
public string SheetName { get; set; }
public string Process { get; set; }
public string Material { get; set; }
public string CutQuality { get; set; }
}
这里我们解析文件。我想文件完全符合预期的格式。没有错误处理,没有格式检查。你可以自由添加一些:)
private Paragraph ReadParagraph(StreamReader reader)
{
Paragraph paragraph = new Paragraph();
paragraph.SheetName = ReadNextValue(reader);
paragraph.Process = ReadNextValue(reader);
paragraph.Material = ReadNextValue(reader);
paragraph.CutQuality = ReadNextValue(reader);
return paragraph;
}
private string ReadNextValue(StreamReader reader)
{
return reader.ReadLine().Split('=')[1].Trim();
}
在这里,我们将已解析的段落添加到树中。
private void AddParagraphToTree(Paragraph paragraph)
{
var sheetNode = AddNode(treeView.Nodes, paragraph.SheetName);
var processNode = AddNode(sheetNode.Nodes, paragraph.Process);
var materialNode = AddNode(processNode.Nodes, paragraph.Material);
AddNode(materialNode.Nodes, paragraph.CutQuality);
}
private TreeNode AddNode(TreeNodeCollection nodes, string key)
{
if (!nodes.ContainsKey(key))
nodes.Add(new TreeNode(key) { Name = key });
return nodes[key];
}