【问题标题】:linq xml parsing to create checkboxlinq xml解析以创建复选框
【发布时间】:2011-03-07 07:22:18
【问题描述】:

您好,我实现了一个字典对象:

public partial class Window1 : Window
{
    ...
    public Dictionary<string, string> Dictionarycheck = new Dictionary<string, string>();

    public Window1()
    {
        Dictionarycheck.Add("Execbuildstartingmail", "Execbuildstartingmail");
        Dictionarycheck.Add("Execbuildlastmail", "Execbuildlastmail");
        ...
    }
}

然后我有要解析的 xml 文件。我有超过 1 个这样的目标要解析。我应该解析属性“if”的字符串,所以在这里我需要“Execexample”作为字符串。

<project>
...
   <target if="Execexample">
   ...
   </target>
...
</project>

为了做这个解析,我尝试实现这个代码(我不确定它是否正确):

private void xmlparsingButton_Click(object sender, RoutedEventArgs e)
{
    XDocument xmlDoc = XDocument.Load(@"C:\Build.xml");
    var abc = from target in xmlDoc.Descendants("target")
              select (string)target.Attribute("if");
    foreach(string target in abc)
    {
        // check this value whether if it exist in the dictionary. 
        // if not create a checkbox for it.
    }                      
}

对于“foreach”语句,我应该检查字典对象。如果字典中没有这样的值,我将在我的 tabitem 5 中创建一个复选框,并将名称作为字符串(例如 ExecexamplecheckBox)。

我应该如何实现这样的foreach函数?

编辑 1: 我忘了添加一些东西。如果选中这些新复选框,我需要将文本写入文本文件。我怎么做?他们需要写入之前写入的文本文件。

【问题讨论】:

  • @jeremychan,仍在消化您的问题,但似乎您应该/可以使用 HashSet 而不是 Dictionary
  • @jackiekirby 嗨,感谢您的意见,我会继续阅读
  • @jeremychan,你怎么知道这个复选框?那是复选框的名称是什么?它是您的字典项目的名称吗?另外,请非常清楚您需要了解/学习的内容。看起来您期待的是一个完整的工作解决方案,而不仅仅是可以帮助您实现目标的示例代码。
  • @jeremychan,您说“如果选中复选框,我需要在文本文件中写入一行,我该怎么做?”。做什么,在文本文件中写一行或者查看一个复选框是否被选中,或者找到一个复选框,看看它是否被选中?
  • @shiv kumar,您好,我只是不确定您是否完全理解我的问题,因此我必须确保我提出有关您的解决方案的问题

标签: c# wpf xml linq parsing


【解决方案1】:

这能解决问题吗?

foreach(string target in abc)
{
  //check this value whether if it exist in the dictionary. if not create a checkbox for it.
  if (!Dictionarycheck.ContainsKey(target))
  {
    CheckBox chk = new CheckBox();
    chk.Text = target;
    SomePanel.Controls.Add(chk);
  }
}

【讨论】:

  • 您好,刚收到一个问题。这个 SomePanel.Controls.Add(chk) 有什么作用?
  • SomePanel 是您要在其上放置CheckBox 的控件。 Controls.Add 表示您在SomePanel 上添加了一个控件。 chk 表示您正在将 chk 添加到 SomePanel
  • @jeremychan 以上是否回答了您的问题?
  • @funmunpieng 抱歉,我仍在尝试其他解决方案。会更新你
  • @funmunpieng 我有一个定义了网格的 tabitem。我如何在其中添加控件?我试过tabitem5.Controls.Add(chk); 不起作用
【解决方案2】:

我可以在这里看到两个不同的问题:

1 - 数据问题 解析 xml 文件并将必要的数据提取到单独的列表或字典中。

2 - 用户界面 根据数据问题的输出生成一系列复选框。

首先,您应该将数据问题与 UI 分开。在 foreach 循环中构建一个对象列表。该对象应至少具有一个用于显示的字符串属性和一个用于绑定复选框的布尔属性。

其次,在您的 UI 上创建一个 ItemsControl(例如 ListBox)并将其 ItemsSource 绑定到上述列表,然后将 ItemTemplate 设置为包含 CheckBox 的 DataTemplate

<ListBox ItemsSource="{Binding Path=SomeList}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox Content="{Binding Path=DisplayString}" IsChecked="{Binding Path=Selected}"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

在用户完成选中/取消选中列表后,您将看到一个列表,您可以在该列表上将文本行写入文件。

在处理 WPF 时,您应该学习几个概念,其中最难理解的可能是 UI 和数据之间的关注点分离,以及数据层如何为 UI 提供数据以为您创建元素。使用这种技术应该不需要在代码中创建新的复选框。

另外,最好不要直接绑定到字典(虽然它是possible),但您应该使用 ObservableCollection 作为您的 ItemsSource,它会为您处理 UI 的更改通知。

【讨论】:

【解决方案3】:

从外观上看,正如@Jackie 所提到的,您可以使用 HashSet。除了在这种情况下正确使用正确的数据结构之外,它不会有什么不同。

  var filePath = "PathAndFileNameOfSomeFile.txt";
  var hashset = new HashSet<string> { { "Execbuildstartingmail" }, { "Execbuildlastmail" } };
  var xmlString = "<project><target if=\"Execexample\"></target><target if=\"Execbuildlastmail\"></target></project>";
  var xDocument = XDocument.Parse(xmlString);
  var attributeValues = from attrs in xDocument.Descendants("target").Attributes("if")
                        select attrs.Value;

  foreach (var value in attributeValues)
  {
    var controls = this.Controls.Find(value, true);
    //No checkbox with matching name found
    if (controls.Length == 0)
    {
      if (!hashset.Contains(value))
      {
          var checkbox = new CheckBox();
          checkbox.Parent = tabControl1.TabPages["tabPage2"];
          checkbox.Text = value;          
      }
    }
      //checkbox with the given name was found AND is checked
    else if (controls.Length == 1 && ((CheckBox)controls[0]).Checked)
    {
      using (var writer = File.AppendText(filePath))
      {
        writer.WriteLine(value);
      }
    }
  }

修改后 我不清楚你在编辑中所说的内容,所以我会重新措辞...... 在 foreach 中,如果复选框存在并被选中,那么您需要将一些测试写入文本文件。如果他们不检查,则无事可做。如果复选框不存在,那么将其添加到选项卡中是否正确?

我更新了代码,向您展示了如何做三件事:

  1. 在表单中查找复选框。
  2. 查看复选框是否被选中
  3. 将一些文本写入文本文件。

即使我提供的代码也不能“完全”完成您想要的,我相信各个部分应该可以帮助您实现最终目标。如果没有,请简单地提出您的问题,并提供非常明确的说明,说明您具体需要帮助的地方。

【讨论】:

  • 嗨 shiv kumar,感谢您的意见。我的问题是如何实现 foreach 语句来检查字典值。无论如何,我的 xml 文件内容总是会改变,因此我不能像你那样硬编码。请检查我的编辑!
  • @jeremychan,在我的示例代码中,我使用了一个字符串变量 (xmlString) 作为示例,因此我可以编写代码并在发布之前对其进行测试。这是一个“示例”,因此请从中获取所需的内容。
  • 对不起,如果我让你感到困惑。我已经创建了复选框(硬编码),它们所做的是,如果它们被选中,它们会将文本写入文本文件。在这个“Foreach”语句中,我想用字典或哈希集进行检查......如果在字典或哈希集中找不到这些,将创建复选框。 (这是因为那些硬编码的复选框被添加到字典或哈希集中)一旦这些新的复选框被创建并被选中,它们会将行写入相同的文本文件,就像硬编码的复选框被选中时所做的那样。
  • “foreach”语句不用于检查硬编码复选框是否被选中,因为我已经为这些复选框编写了代码
  • @jeremychan,我已经更新了我的答案和代码。请看看这是否有帮助。基本上,我已经为您尝试做的各种事情提供了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多