Помогите разобраться с циклом и xml. Это мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников.
Я создал форму, в ней динамически создал боксы и чекбоксы. Скриншот.
Можно добавлять сколько угодно табов...
Мне нужно получить следующий результат:
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");
И получаю следущий результат:
Пишем вопрос тут 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")
)
)
);
На выходе:
Комментариев нет:
Отправить комментарий