2015-05-20 3 views
0

У меня относительно простое приложение Winforms и я использую C#. Я использую LINQ (system.xml.linq) ... Я успешно сохраняю элементы текстового поля (отдельные элементы) в свой XML-файл.Сохранение элементов списка как дочерних элементов в xml-файле с использованием linq и C#

У меня есть listBox элементов и хотел бы, чтобы этот список сохранялся как дочерние узлы в XML-файле. Так что мой XML конечный результат будет выглядеть примерно так:

<items> 
<centerName>My Center</centerName> 
<poc>Mr. Jones</poc> 
<servicedUnits> 
    <state>Texas</state> 
    <state>Iowa</state> 
    <state>Hawaii</state> 
</servicedUnits> 
</items> 

У меня есть этот код, который я использую для записи XML:

private void writeFCATSettings() 
    { 
     XDocument doc = new XDocument 
     (
      new XElement 
       ("Items", 
       new XElement("textBoxCenterName", textBoxCenterName.Text), 
       new XElement("textBoxContactFirstName", textBoxContactFirstName.Text), 

       new XElement("servicedUnits", "<listBoxServicedUnits.Items>") 

      ) 
     ); 
     doc.Save(@"Settings.xml"); 
    } 

Я довольно уверен, что мне нужно поставить код для итерации через список между скобками.

И, наконец, я нашел этот код, который выполняет итерацию по моему списку ... но если я просто вставлю его в космос ... это не сработает.

XElement servicedUnits = new XElement("ServicedUnits"); 
     foreach (var item in listBoxServicedUnits.Items) 
     { 
      servicedUnits.Add(new XElement("unit", item)); 
     } 

     XDocument document = new XDocument(); 
     document.Add(servicedUnits); 

Спасибо за любые идеи ...

ER

+0

Что у вас в 'listBoxServicedUnits.Items'? строки? – har07

ответ

0

Предполагая элементов вашего ListBox являются строки, которые вы могли бы сделать это:

private void writeFCATSettings() 
{ 
    XDocument doc = new XDocument(
     new XElement("Items", 
      new XElement("textBoxCenterName", textBoxCenterName.Text), 
      new XElement("textBoxContactFirstName", textBoxContactFirstName.Text), 
      new XElement("servicedUnits", 
       listBoxServicedUnits 
       .Items 
       .OfType<string>() 
       .Select(item => new XElement("unit", item))))); 
    doc.Save(@"Settings.xml"); 
} 

Или, если они не являются строками или они являются смешанными типами, вы можете сделать это:

private void writeFCATSettings() 
{ 
    XDocument doc = new XDocument(
     new XElement("Items", 
      new XElement("textBoxCenterName", textBoxCenterName.Text), 
      new XElement("textBoxContactFirstName", textBoxContactFirstName.Text), 
      new XElement("servicedUnits", 
       listBoxServicedUnits 
       .Items 
       .OfType<Object>() 
       .Select(x => TransformYouObjectToAStringHere) 
       .Select(item => new XElement("unit", item))))); 
    doc.Save(@"Settings.xml"); 
} 
+0

Я получаю следующее сообщение об ошибке: Ошибка 'System.Windows.Forms.ListBox.ObjectCollection' не содержит определения для 'Select' и никакого метода расширения 'Select', принимающего первый аргумент типа 'System.Windows.Forms .ListBox.ObjectCollection '(вам не хватает директивы using или ссылки на сборку?) – robertsirwin

+0

О, право, 'ItemCollection' только наследует' IEnumerable' не 'IEnumerable '. В ближайшее время я обновлю ответ. –

+0

Большое спасибо за вашу помощь ... Извиняюсь за недостаток навыков кодирования ... но я не уверен, что должно произойти в вашем решении, где у вас есть «TransformYouObjectToAStringHere» ... – robertsirwin

Смежные вопросы