2015-06-25 2 views
1

Вопрос может быть немного долго:Загрузка данных динамически в повторитель из кода позади файл

Я сделав Интернет оценку портал и там другой тип вопросов в базе данных, которая должна быть загружена в web-форме , Вопросами могут быть одиночный ответ (переключатель) или мульти-ответ (кнопка). Поэтому в зависимости от типа я создаю переключатель или флажок согласно требованию и загружаю его в повторитель во время выполнения. Код выглядит следующим образом:

SqlCommand cmd = new SqlCommand("select * from tbl_QuestionAnswer", con); 
SqlDataReader dr = cmd.ExecuteReader(); 

while (dr.Read()) 
{ 
    if ((string)dr["type"] == "SingleAnswer") 
    { 
     RadioButton rAnswer1 = new RadioButton(); 
     rAnswer1.ID = "rbl_Answer1"; 
     rAnswer1.GroupName = "QAnswer1"; 
     rAnswer1.Text = dr["Answer1"].ToString(); 
     Panel PAnswer1 = e.Item.FindControl("PAnswer1") as Panel; 
     PAnswer1.Controls.Add(rAnswer1); 


     RadioButton rAnswer2 = new RadioButton(); 
     rAnswer2.ID = "rbl_Answer2"; 
     rAnswer2.GroupName = "QAnswer1"; 
     rAnswer2.Text = dr["Answer2"].ToString(); 
     Panel PAnswer2 = e.Item.FindControl("PAnswer2") as Panel; 
     PAnswer2.Controls.Add(rAnswer2); 


     RadioButton rAnswer3 = new RadioButton(); 
     rAnswer3.ID = "rbl_Answer3"; 
     rAnswer3.GroupName = "QAnswer1"; 
     rAnswer3.Text = dr["Answer3"].ToString(); 
     Panel PAnswer3 = e.Item.FindControl("PAnswer3") as Panel; 
     PAnswer3.Controls.Add(rAnswer3); 


     RadioButton rAnswer4 = new RadioButton(); 
     rAnswer4.ID = "rbl_Answer4"; 
     rAnswer4.GroupName = "QAnswer1"; 
     rAnswer4.Text = dr["Answer4"].ToString(); 
     Panel PAnswer4 = e.Item.FindControl("PAnswer4") as Panel; 
     PAnswer4.Controls.Add(rAnswer4); 
    } 

    else 
    { 
     CheckBox cAnswer1 = new CheckBox(); 
     cAnswer1.ID = "chk_Answer1"; 
     cAnswer1.Text = dr["Answer1"].ToString(); 
     Panel PAnswer1 = e.Item.FindControl("PAnswer1") as Panel; 
     PAnswer1.Controls.Add(cAnswer1); 

     CheckBox cAnswer2 = new CheckBox(); 
     cAnswer2.ID = "chk_Answer2"; 
     cAnswer2.Text = dr["Answer2"].ToString(); 
     Panel PAnswer2 = e.Item.FindControl("PAnswer2") as Panel; 
     PAnswer2.Controls.Add(cAnswer2); 

     CheckBox cAnswer3 = new CheckBox(); 
     cAnswer3.ID = "chk_Answer3"; 
     cAnswer3.Text = dr["Answer3"].ToString(); 
     Panel PAnswer3 = e.Item.FindControl("PAnswer3") as Panel; 
     PAnswer3.Controls.Add(cAnswer3); 

     CheckBox cAnswer4 = new CheckBox(); 
     cAnswer4.ID = "chk_Answer4"; 
     cAnswer4.Text = dr["Answer4"].ToString(); 
     Panel PAnswer4 = e.Item.FindControl("PAnswer4") as Panel; 
     PAnswer4.Controls.Add(cAnswer4); 
    } 
} 

Но проблема в том, что все ответы загружаются во все вопросы. то есть из этого dr ["Answer1"] он берет все данные в столбце «Ответ1», а затем делает флажок или переключатель. Я не знаю, почему это происходит, поскольку он должен принимать только строку onr и данные только из этой строки.

Также это работает до 2 вопросов. После этого, если я добавлю третий вопрос и попытаюсь его загрузить, он дает сообщение об ошибке «Несколько элементов управления с одинаковым идентификатором« rbl_Answer1 ». FindControl требует, чтобы элементы управления имели уникальные идентификаторы». И это тоже правильно. Поэтому мне нужен подход, чтобы загрузить вопросы в веб-форму динамически в зависимости от единого ответа или нескольких -asnwer

+0

Как вы дали имя_группы для радиокнопок. Вам не нужен идентификатор. Вы должны использовать RadiobuttonList и сохранить идентификатор radioobuttonlist также динамическим. Не жестко заданные значения, как в вашем сообщении. – Amit

+1

У вас много дублирующегося кода. Вы думали о рефакторинге? Все эти «RadioButton rAnswer» = новый RadioButton(); ... «Кодовые блоки довольно похожи (такие же, как и с CheckBoxes). Рефакторинг этого по своему методу может улучшить читаемость. #justsaying – Alexander

+0

Динамическое добавление хорошее. Но тогда та же самая проблема сохраняется: dr [ColumnName] принимает все данные из этого столбца и добавляет в том же вопросе. И насколько я вижу, главная проблема для этого - повторитель. Из-за Repeater (панель находится внутри Repeater), dr [ColumnName] циклически во всех данных. Поэтому я думаю, что удаление всех элементов из страницы aspx и добавление всех элементов из кода за файлом, то есть

, ,
и т. Д. И добавление в него всего содержимого. – Jaimin

ответ

1

Это очень ясно, что вы можете создать контроль с тем же идентификатором , если у вас есть более одной строки в запросе ,

Попробуйте сделать динамическое поле/управления и установить динамический идентификатор для тех управления

while (dr.Read()) 
{ 
    if ((string)dr["type"] == "SingleAnswer") 
    { 
     RadioButton rAnswer1 = new RadioButton(); 
     rAnswer1.ID = "rbl_Answer" + dr["AnswerID1"].ToString(); 

или что-то в этом роде ...

+0

да .. точно .. это хорошо. Я, конечно же, попытаюсь использовать его и вернуться к вам, если он работает или нет. благодаря – Jaimin

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