Не удается найти выбранное значение динамически добавленных элементов управления в повторителе - PullRequest
0 голосов
/ 11 января 2011

Я создаю страницу опроса, которая содержит список вопросов и ответов, которые могут быть списками радиокнопок, флажками или текстовыми полями.Эти элементы управления динамически добавляются в Repeater в его событии ItemDataBound с использованием Controls.Add.

Мне удалось хорошо отобразить страницу, но когда я отправляю форму и перебираю элементы управления в повторителе, чтобы получить выбранные значенияиз значков радиокнопок и текстовых полей FindControl возвращает значение NULL.Что мне нужно сделать, чтобы получить выбранные значения?Я пытался перебрать RepeaterItems, но это тоже вернуло ноль.Я пробовал разные типы FindControl, но он никогда не разрешает типы управления.Это работает, если я добавляю декларативный DataBinder в репитере, как это

<asp:Repeater ID="rptSurvey" runat="server" Visible="true" EnableViewState="true" >
 <ItemTemplate>
      <%# DataBinder.Eval(Container.DataItem, "Question") %>
 </ItemTemplate>
</asp:Repeater>

Однако я хочу динамически добавлять элементы управления, но при этом я не могу получить выбранные значения при отправке.Это основная структура моего кода ...

<html>
<asp:Repeater ID="rptSurvey" runat="server" Visible="true">                      
</asp:Repeater>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
</html>

protected void Page_Load(object sender, EventArgs e)
{

  ...

            if (!IsPostBack)
            {
                rptSurvey.DataSource = GetQuestions();
                rptSurvey.DataBind();
            }
  ...

}

protected void rptSurvey_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                string question = (DataBinder.Eval(e.Item.DataItem, "Question")).ToString();

              litQuestion = new Literal();
                litQuestion.Text = question;
        RadioButtonList rblAnswer = (RadioButtonList)item;


                    rptSurvey.Controls.Add(rblAnswer);
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
           ...
            Dictionary<int, string> answers = new Dictionary<int, string>();

            try
            {
                var list = FindControls(rptSurvey, c => c is RadioButtonList || c is CheckBoxList || c is TextBox);

                foreach (Control item in list)
                {
                    QuestionId = int.Parse(Questions.Rows[list.IndexOf(item)][0].ToString());

                    if (item is TextBox)
                    {
                        TextBox txtAnswer = (TextBox)item;
                        answers.Add(QuestionId, txtAnswer.Text);
                    }
                    else if (item is RadioButtonList)
                    {
                        RadioButtonList rblAnswer = (RadioButtonList)item;
                        answers.Add(QuestionId, rblAnswer.SelectedItem.Text);
                    }

                    else if (item is CheckBoxList)
                    {
                        // Iterate through the Items collection of the CheckBoxList 
                        string cblMultiAnswer = "";
                        for (int i = 0; i < cblAnswer.Items.Count; i++)
                        {
                            if (cblAnswer.Items[i].Selected)
                            {
                                cblMultiAnswer += cblAnswer.Items[i].Value + ",";
                            }
                        }

                        answers.Add(QuestionId, cblMultiAnswer);
                    }
                }

               bSurvey.BLInsertSurveyAnswers(answers, dateCreated, _userEmail);
            }
        }

        public static List<Control> FindControls(Control parent, Predicate<Control> match)
        {
            var list = new List<Control>();
            foreach (Control ctl in parent.Controls)
            {
                if (match(ctl))
                    list.Add(ctl);
                list.AddRange(FindControls(ctl, match));
            }
            return list;
}

1 Ответ

1 голос
/ 11 января 2011

сначала вы должны создать дерево управления (всегда - не только для не-обратных передач). сделать это в событии oninit или onpreload.

смотрите здесь: http://www.4guysfromrolla.com/articles/081402-1.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...