Рейтинг:
12
MadMyche
Ваш код работает совершенно нормально; вы просто используете неправильную разметку.
Вы смотрели на HTML, который визуализируется из этого? Это было бы полезно, чтобы вы могли видеть, что происходит.
Я вижу 3 проблемы с HTML, которые будут отображаться:
1 - все переключатели имеют одинаковое значение name="options"
Это дает вам видимую проблему, что вы проверяете кнопку на "вопрос 4", и ваш выбор для всех других вопросов стирается.
2 - у вас есть 4 варианта, и они имеют идентификаторы rb1..rb4. Эти идентификаторы используются компанией label
элемент и будет выбирать соответствующую кнопку при нажатии. Эти же идентификаторы используются в последующих строках. DOM (объектная модель документа) позволяет присвоить идентификатор только 1 элементу. В результате получается, что нажатие на кнопку "выбор 3" для вопроса 1 мог проверьте "выбор 3" на вопрос 4.
3 - переключатели не имеют назначенных им значений, поэтому то, что будет обрабатывать эту форму, не будет знать, что было проверено.
Простое решение проблем 1 & 2-это использование итератора строк int i
как часть имени/id/для атрибутов этих элементов.
Проблема 3 будет исправлена путем добавления атрибута value к входному элементу
Как бы я это сделал, он на самом деле использует другой StringBuilder, чтобы построить храм, прежде чем вы пройдете через свои итерации, и использовать String.Format()
метод внутри цикла, чтобы иметь более чистый внешний вид.
Другие вещи:
1 - я также заменил набор данных на DataTable; поскольку вам понадобится только набор данных, если будет больше 1 результирующего набора, дальнейшая очистка кода.
2 - я использовал строковые литералы ( @ ), чтобы избежать одинарных кавычек.
3 - ваш исходный код имеет каждый вариант в своем собственном TD. Что дает вам пять строк 1 из 1 столбца. Это прекрасно, однако; это не согласуется с результатом "без вопросов", состоящим из 1 строки из 5 столбцов. Поэтому я снял обертку TR на вопрос и ответы
У вас все еще есть некоторые возможности для улучшения.
1 - я разделся до нитки. черный цвет на каждом элементе. Вам нужно будет сделать это только один раз, на уровне таблицы. Вы можете назначить это в блоке стилей на странице.
2 - Вы можете закрыть окно стол после того, как оба блока IF и удалить строку кода
DataTable dt = new DataSet();
StringBuilder htmlTable = new StringBuilder();
string query = "SELECT DISTINCT * FROM Tablename ORDER BY Number ASC";
SqlDataAdapter sda = new SqlDataAdapter(query, con);
sda.Fill(dt);
htmlTable.Append("<table border='0'>");
if (!object.Equals(dt, null))
{
StringBuilder sbQA = new StringBuilder();
sbQA.AppendLine(@"<tr>");
sbQA.AppendLine(@"<td>{0} Question</td></tr>");
sbQA.AppendLine(@"<td><input type=""radio"" id=""rb1_{2}"" name=""options{2}"" value=""A""> A) <label for=""rb1_{2}"">{3}</label></td>");
sbQA.AppendLine(@"<td><input type=""radio"" id=""rb2_{2}"" name=""options{2}"" value=""B""> B) <label for=""rb2_{2}"">{4}</label></td>");
sbQA.AppendLine(@"<td><input type=""radio"" id=""rb3_{2}"" name=""options{2}"" value=""C""> C) <label for=""rb3_{2}"">{5}</label></td>");
sbQA.AppendLine(@"<td><input type=""radio"" id=""rb4_{2}"" name=""options{2}"" value=""D""> D) <label for=""rb4_{2}"">{6}</label></td>");
sbQA.AppendLine(@"</tr>");
string aQuestion = sbQA.ToString();
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
htmlTable.AppendFormat(aQuestion, dt.Rows[i]["Number"], i, dt.Rows[i]["ChoiceA"], dt.Rows[i]["ChoiceB"], dt.Rows[i]["ChoiceC"], dt.Rows[i]["ChoiceD"] );
}
htmlTable.Append("</table>");
}
else
{
htmlTable.Append(@"<tr><td style=""text-align:center;"" colspan=""5"">There are No Records.</td></tr>");
htmlTable.Append("</table>");
}
}
Member 8583441
те же ошибки, которые приходят, когда я выполняю ваш код, также как повторение вопросов с опциями и переключателями проверяется с помощью одного вопроса. Остальные переключатели вопросов не проверяются, если я проверяю, что вопрос предыдущие вопросы снят, это была проблема. На самом деле мой код взят из метода, вызывающего привязку к концепции ретранслятора. Я также опубликую эту часть. Эта часть находится после вызова метода.
Ретранслятор RptrQuestionsAndOptions = новый ретранслятор();
Заголовок TemplateBuilder = новый TemplateBuilder();
заголовок.AppendLiteralString("");
TemplateBuilder itemTemplate = новый TemplateBuilder();
свойства itemtemplate.AppendLiteralString(GetQuestionNumberQuestionChoices());
TemplateBuilder footer = новый TemplateBuilder();
нижний колонтитул.AppendLiteralString("Вопросы");
RptrQuestionsAndOptions.HeaderTemplate = заголовок;
RptrQuestionsAndOptions.Свойства itemtemplate = свойства itemtemplate;
RptrQuestionsAndOptions.FooterTemplate = нижний колонтитул;
string query = "SELECT DISTINCT * FROM TableName ORDER BY Number ASC";
SqlDataAdapter sda = новый SqlDataAdapter(запрос, con);
DataSet ds = новый набор данных();
ПДД.Заполнить(ДС);
RptrQuestionsAndOptions.Источник данных = ds;
RptrQuestionsAndOptions.Привязку();
дивтабконтент.Управления.Добавить(RptrQuestionsAndOptions);
Member 8583441
извините, нижний колонтитул.AppendLiteralString("вопросы"); неправильно набран.Правильный вариант-нижний колонтитул.AppendLiteralString("закрывающая таблица"); HTML здесь не печатается, поэтому пишется в текстовом формате, а также в заголовке.AppendLiteralString("открытие таблицы с тегом thead внутри tr и td");
Member 8583441
GetQuestionNumberQuestionChoices() в этом методе я написал фрагмент кода, который размещен в вопросе
Member 8583441
Это решение очень помогло мне изучить концепцию stringbuilder я очень благодарен вам, сэр, за то, что вы заставили меня понять, что такое stringbuilder и как добавлять HTML-теги, а также appendingline, наконец, appendformat в этом решении. Спасибо сэр еще раз чтобы заставить меня узнать новую концепцию как использовать этот stringbuilder
MadMyche
Использование элемента управления ретранслятором и шаблонов было бы важно знать, когда вы делали исходный пост; и весь код должен был быть включен.
Member 8583441
Да, сэр, этот ретранслятор создал мне проблему, поэтому я удалил его и просто назначил строковую переменную этому методу, и теперь он работает как шарм, не повторяя вопросы, большое спасибо, сэр
Member 8583441
Тем не менее проблема с переключателем существует как ее решить сэр
Member 8583441
Теперь моя проблема решена повторением вопросов и переключателем checked event. Благодарен вам сэр что вы предоставили мне правильное решение которое было сделано для меня