如何基于XML数据自定义表单?

时间:2015-02-15 14:44:39

标签: c# xml

我正在创建一个简单的待办事项列表,并希望将任务存储在XML文件中。我的XML文件如下所示:

    <Task>
        <Title>Make a List</Title>
        <Description>I should make a List!</Description>
        <Done>false</Done>
    </Task>

每个任务都在<Task>标签中,用于存储标题,说明以及是否已完成。

加载表单时,我想使用

为每个任务生成一个复选框

Text = <Title> ToolTip = "<Description>" Checked = <Done>

现在我的代码看起来像这样:

    void MainFormLoad(object sender, EventArgs e)
    {
        var doc = XDocument.Load(Application.StartupPath + "\\tasker.xml");

        var Title       = doc.Root.Descendants().Single(d => d.Name == "Title").Value; 
        var Description = doc.Root.Descendants().Single(d => d.Name == "Description").Value; 
        var Done        = doc.Root.Descendants().Single(d => d.Name == "Done").Value; 

        MessageBox.Show(Title.ToString() + Environment.NewLine + Description.ToString() ); // Just for Testing
    }

这很有用,但只适用于一项任务。如何为多个任务添加复选框?

2 个答案:

答案 0 :(得分:3)

首先,您需要在XML文件中执行多项任务,例如

<Tasks>
    <Task>
      ...
    </Task>
    <Task>
      ...
    </Task>
</Tasks>

然后你可以迭代所有这样的任务:

var doc = XDocument.Load("...");
var tasks = doc.Root.Elements("Task")
               .Select(x => new { 
                          Title = (string) x.Element("Title"),
                          Description = (string) x.Element("Description"),
                          Done = (bool) x.Element("Done");
                       });

foreach (var task in tasks)
{
    // Use task.Title etc
}

没有使用单独的局部变量,但对我来说它看起来更简单。您可能还想为任​​务创建一个命名类,而不是使用我在此处创建的匿名类型。

请注意,元素的替代方法是为每个任务使用数据属性。

答案 1 :(得分:0)

首先,您可以创建一个任务主元素包装任何任务元素,然后遍历每个元素。 然后XML看起来像:

 <Tasks>
  <Task>
    <Title>Make a List</Title>
    <Description>I should make a List!</Description>
    <Done>false</Done>
  </Task>
  <Task>
    <Title>Make a Second List</Title>
    <Description>I should make a Second List!</Description>
    <Done>false</Done>
  </Task>
</Tasks>

加载XDocument后,迭代只适用于每个:

        foreach (var child in doc.Root.Descendants("Task"))
        {
            var Title = child.Descendants().Single(d => d.Name == "Title").Value;
            var Description = child.Descendants().Single(d => d.Name == "Description").Value;
            var Done = child.Descendants().Single(d => d.Name == "Done").Value;

        }

希望对你有所帮助。