Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

C# xml в цикле for

Помогите разобраться с циклом и xml. Это мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников. Я создал форму, в ней динамически создал боксы и чекбоксы. Скриншот. Можно добавлять сколько угодно табов...
Мне нужно получить следующий результат:
NAME OF THE TEST 2017 Тест по Математики за 2016 год 1 1,5 45 4 Вика Настя Катя ..... .... остальные вопросы N число.... .....
Использую for для сбора данных из боксов, обращаясь к TabControl
XDocument xdoc = new XDocument(); XElement testXML = new XElement("test");//заголовок XElement headXML = new XElement("head","заголовок XML");//заголовок XElement discriptionXML = new XElement("Discriptions","ОПИСАНИЕ ТЕСТА");//описание теста XElement qwXML = new XElement("qw");//начала вопросов XElement questionXMLX = new XElement("q");// начало вопроса XElement questionXMLAY = new XElement("a");// ответ XElement questionXMLAN = new XElement("a");// ответ
XAttribute DiscriptionAttr = new XAttribute("text", "ПУСТО");//собираем текст XAttribute questionXAttr = new XAttribute("text", "ПУСТО");//собираем текст XAttribute questionSRCXAttr = new XAttribute("src", "ПУСТО");//собираем картинку XAttribute questionAAttrN = new XAttribute("right", "no");//собираем текст XAttribute questionAAttrY = new XAttribute("right", "yes");//собираем текст
// TextBoxQuest.Tag = "TxBOXquery"; //Поле вопроса //RadioButton[i].Tag = "rbAnswer"; //Радиобуттон правильного ответа //TextBoxAns[i].Tag = "TxBOXAnswer";//Варианты ответа questionXMLAY.Add(questionAAttrY); questionXMLAN.Add(questionAAttrN); string ctrl ="";//собираем текст из полей string tagz = ""; //смотрим что это за поле int qcount = tabControl1.TabCount * (CountAnswerInTest*2);
for (int itab = 0; itab < tabControl1.TabCount; itab++)//перебираем табы { for (int i = 0; i <= CountAnswerInTest*2; i++)//перебираем внутренние ответы { ctrl = tabControl1.Controls[itab].Controls[i].Text;//собираем текст из полей tagz = tabControl1.Controls[itab].Controls[i].Tag.ToString(); //смотрим что это за поле Console.WriteLine(tagz);//debug if (tagz == "TxBOXquery") //если равно TxBOXquery то это поле с вопросом { Console.WriteLine(ctrl);//debug Console.WriteLine(questionXMLX);//debug questionXMLX.Add(ctrl);//Добавляем его Console.WriteLine(questionXMLX);//debug }//пишем вопрос
if (tagz == "rbAnswer")//если равно rbAnswer то это поле с ответом if (ctrl == "")//если текста нет, то скорее всего это радиобуттон\ { Control ctrlb = tabControl1.Controls[itab].Controls[i]; //присваем чекбокс if (Convert.ToString(ctrlb) == "System.Windows.Forms.RadioButton, Checked: False") //смотрим нажат или нет { Console.WriteLine("False");//debug // questionXMLA.Add(questionAAttrN); int ix = ++i;//убираем непонятные пустые поля string ctrlX = tabControl1.Controls[itab].Controls[ix].Text;//собираем текст из полей
questionXMLX.Add(questionXMLAN, ctrl, ctrlX); //добавляем в xml
} else //если чекбокс не нажат то пишем NO { int ix = ++i;//убираем непонятные пустые поля string ctrlX = tabControl1.Controls[itab].Controls[ix].Text;//собираем текст из полей Console.WriteLine("True");//debug questionXMLX.Add(questionXMLAN, ctrl, ctrlX);/ добавляем в xml // questionXMLA.Add(questionAAttrY);
} } }
qwXML.Add(questionXMLX);// добавляем всё в блок
}//закончили перебирать табы testXML.Add(headXML); testXML.Add(discriptionXML); testXML.Add(qwXML);
xdoc.Add(testXML); xdoc.Save("myXML2.xml");
И получаю следущий результат:
заголовок XML ОПИСАНИЕ ТЕСТА Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22Пишем вопрос тут 33 Ответ 30 Ответ 31 Ответ 32 Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22 Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22Пишем вопрос тут 33 Ответ 30 Ответ 31 Ответ 32
Ошибка получается вот тут, не добавляется новый вопрос, хотя циклы проходят нормально и срабатывает questionXMLX.Add(ctrl), который должен добавлять новый :
Ответ 12Пишем вопрос тут 22
А надо, чтоб было вот так:
Ответ 12 Пишем вопрос тут 22
Не понимаю, почему неправильно работает:
Console.WriteLine(ctrl);//debug Console.WriteLine(questionXMLX);//debug questionXMLX.Add(ctrl);//Добавляем его в xml Console.WriteLine(questionXMLX);//debug
Помогите, пожалуйста.


Ответ

Так происходит, потому что используется один и тот же XElement. Один new XElement("q") эквивалентен <\q>. Для решения твоей задачи надо каждый раз создавать новый XElement, а в конце итерации цикла добавлять в коллекцию qwXML.Add(questionXMLX).
Что-то вроде такого:
XElement questionXMLX = new XElement("q"); // Логика по заполнению questionXMLX qwXML.Add(questionXMLX);
Чтобы лучше понять логику взаимодействия с XElement вот пример кода и XML, который получается в итоге:
XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement("phone", "425-555-0145", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042") ) ) );
На выходе:
Patrick Hines 206-555-0144 425-555-0145

123 Main St Mercer Island WA 68042

Комментариев нет:

Отправить комментарий