Member 8583441 Ответов: 1

Тип ввода радио не работает должным образом, когда он добавляется к C# stringbuilder


я привязываю данные к HTML-таблице с помощью c# stringbuilder. Я получаю данные но у меня есть две проблемы:
1) Если у меня есть данные 10 значений, то 10 значений привязываются к таблице HTML, но повторяются 10 раз
2) я привязываю эти значения к переключателю типа ввода в c# asp.net веб-форма приложения. Эта привязка выполнена идеально но моя проблема с этим переключателем заключается в том что когда я проверяю этот переключатель все в порядке но если я нажму на второй переключатель данных первый переключатель данных будет очищен это моя проблема может ли любое тело решить ее за меня

Что я уже пробовал:

DataSet ds = new DataSet();
StringBuilder htmlTable = new StringBuilder();
string query = "SELECT DISTINCT * FROM Tablename ORDER BY Number ASC";
SqlDataAdapter sda = new SqlDataAdapter(query, con);
sda.Fill(ds);
htmlTable.Append("<table border='0'>");
if (!object.Equals(ds.Tables[0], null))
{
    if (ds.Tables[0].Rows.Count > 0)
    {
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            htmlTable.Append("<tr style='color:black;'>");
            htmlTable.Append("<td>" + ds.Tables[0].Rows[i]["Number"] + ')' + ' ' + ds.Tables[0].Rows[i]["Question"] + "</td>");
            htmlTable.Append("</tr>");
            htmlTable.Append("<tr style='color:black;'>");
            htmlTable.Append("<td>" + "<input type=\"radio\" id=\"rb1\" name=\"options\" />" + " A) " + "<label for='rb1'>" + ds.Tables[0].Rows[i]["ChoiceA"] + "</label>" + "</td>");
            htmlTable.Append("</tr>");
            htmlTable.Append("<tr style='color:black;'>");
            htmlTable.Append("<td>" + "<input type=\"radio\" id=\"rb2\" name=\"options\" />" + " B) " + "<label for='rb2'>" + ds.Tables[0].Rows[i]["ChoiceB"] + "</label>" + "</td>");
            htmlTable.Append("</tr>");
            htmlTable.Append("<tr style='color:black;'>");
            htmlTable.Append("<td>" + "<input type=\"radio\" id=\"rb3\" name=\"options\" />" + " C) " + "<label for='rb3'>" + ds.Tables[0].Rows[i]["ChoiceC"] + "</label>" + "</td>");
            htmlTable.Append("</tr>");
            htmlTable.Append("<tr style='color:black;'>");
            htmlTable.Append("<td>" + "<input type=\"radio\" id=\"rb4\" name=\"options\" />" + " D) " + "<label for='rb4'>" + ds.Tables[0].Rows[i]["ChoiceD"] + "</label>" + "</td>");
            htmlTable.Append("</tr>");
        }
        htmlTable.Append("</table>");
    }
    else
    {
        htmlTable.Append("<tr>");
        htmlTable.Append("<td style='text-align:center;' colspan='5'>There is No Records.</td>");
        htmlTable.Append("</tr>");
        htmlTable.Append("</table>");
    }
}

F-ES Sitecore

Мой главный совет состоял бы в том, чтобы вообще не делать ничего подобного, использовать ретранслятор для генерации строк элементов управления.

Member 8583441

Да сэр я использовал ретранслятор для этого но эта привязка выполняется другим методом и это назначается ретранслятору itemtemplate и связывает данные с ретранслятором

1 Ответов

Рейтинг:
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. Благодарен вам сэр что вы предоставили мне правильное решение которое было сделано для меня