LINQ XML разбора для создания флажок - PullRequest
0 голосов
/ 07 марта 2011

Привет, у меня реализован объект словаря:

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 такой цели для анализа. Я должен проанализировать строку атрибута «если», поэтому здесь мне понадобится «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" я должен выполнить проверку с объектом словаря. Если в словаре нет такого значения, я создам флажок в моем табите 5 и имя в виде строки (например, ExecexamplecheckBox).

как мне реализовать такую ​​функцию foreach?

РЕДАКТИРОВАТЬ 1: Я забыл что-то добавить. Мне нужно написать текст в текстовый файл, если эти новые флажки установлены. Как я могу это сделать? И они обязаны записывать в текстовый файл, который был написан ранее.

Ответы [ 3 ]

0 голосов
/ 07 марта 2011

Решает ли это проблему?

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);
  }
}
0 голосов
/ 07 марта 2011

Здесь я вижу две отдельные проблемы:

1 - проблема с данными. Разбор файла xml и извлечение необходимых данных в отдельный список или словарь.

2 - интерфейс пользователя. Создание серии.флажков, основанных на выводе проблемы с данными.

Сначала вы должны отделить проблему данных от пользовательского интерфейса.В цикле foreach создайте список объектов.Объект должен иметь по крайней мере строковое свойство для отображения и логическое свойство для флажка, к которому необходимо привязаться.

Во-вторых, в вашем пользовательском интерфейсе создайте ItemsControl (например, ListBox) и привяжите его ItemsSource кПриведенный выше список, затем установите ItemTemplate на DataTemplate, содержащий CheckBox

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

После того, как пользователь завершит проверку / снятие отметки с списка, у вас останется список, в который можно записать свои текстовые строки в файл.

Есть несколько концепций, которые вы должны изучить при работе с WPF, вероятно, сложнее всего разобраться с разделением проблем между пользовательским интерфейсом и данными, а также с тем, как уровень данных может служить основой для создания пользовательского интерфейса.элементы для вас.Не должно быть необходимости создавать новые флажки в коде, используя эту технику.

Кроме того, вам лучше не связываться напрямую со словарем (хотя это возможно ), но вы должны использоватьObservableCollection в качестве вашего ItemsSource будет обрабатывать уведомления об изменениях в пользовательском интерфейсе для вас.

0 голосов
/ 07 марта 2011

С виду, как упоминал @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. Запишите некоторый текст в текстовый файл.

даже предоставленный мною код не делаетделайте «точно» то, что вы хотите, я считаю, что различные части должны помочь вам достичь вашей конечной цели.Если нет, то, пожалуйста, просто задайте свой вопрос и дайте очень четкое изложение того, где конкретно вам нужна помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...