2013-07-25 3 views
0

Я добавляю список списков радиообмена динамически на страницу и нажимаю кнопку Я хочу сохранить выбранные значения. Я следую этому примеру кода ниже. Как я могу получить выбранныеИндексы этих динамически созданных списков RadioButtonLists? Я потратил большую часть дня на то, чтобы попробовать различные исправления из других подобных вопросов в Интернете, но не повезло. Если я использую «Проверить элемент» в Chrome, я могу видеть RadioButtonLists в желаемых местах якобы с удостоверением я присвоенной (RBQuestion_1, RBQuestion_2 и т.д.),Извлечение значений из динамически созданных списков переключателей

Sub BindForm() 

Dim tblStars As New Table() 
    Dim rb As New RadioButtonList() 
    rb.ID = RBQuestion_" & row("Id") 
    Dim tc As New TableCell() 
    Dim tr As New TableRow() 
    tc.Controls.Add(rb) 
    tr.cells.Add(tc) 

    tblStars.Rows.Add(tr) 

    form1.Controls.Add(tblStars) 
Next 
end sub 


Protected Sub btnSave_click(ByVal sender As Object, ByVal e As EventArgs) 

For Each ctrl As Control In Page.FindControl(RBQuestion_" & row("Id")) 
      If TypeOf ctrl Is RadioButtonList Then 
       Dim rbl As RadioButtonList = DirectCast(ctrl, RadioButtonList) 
       For i As Integer = 0 To rbl.Items.Count - 1 
        If rbl.Items(i).Selected Then 
         'get the value of the selected radio button' 
         Dim value As String = rbl.SelectedItem.Value 
        End If 
       Next 
      End If 
     Next 
end sub 

ответ

1

Вы смотрите внутри данной страницы контрольный список.

Ваши переключатели не будут там. Они находятся в списке управления TableCell, к которому вы добавили их.

Вам нужно найти свою таблицу, затем пройти через каждую строку, и для каждой строки найдите ячейку, а затем внутри ячейки найдите переключатели.

В качестве альтернативы вы можете попробовать добавить кнопки в общий элемент управления объектами с использованием типа RadioButton при их создании. Затем ссылайтесь на них непосредственно из вашего обработчика событий btnSave_Click. Pro: Удаляет необходимость навигации по иерархии элементов управления. Con: Распределяет код из фактической базовой реализации. Это потенциально может вводить в заблуждение относительно истинного расположения этих элементов управления, когда разработчики будут в будущем рассмотрены ... Набор, который потенциально может включать вас после того, как вы успели забыть, что вы сделали и почему. Для меня это обычно около 4 часов в хороший день.

Поэтому я предпочитаю метод навигации по иерархии, поскольку он более правдоподобен тому, как вещи фактически выложены. Но я уверен, что общий метод списка тоже будет работать.


EDIT

Я думаю, что кусок головоломки вы недостающей переопределение метода CreateChildControls.

Я признаю, что ваш вопрос был сформулирован в VB. Но я дерьмова с VB, поэтому я пошел с C#. Надеюсь, что это имеет смысл для вас.

Подтверждено, что это работает в VS 2010 при размещении на сервере разработки ASP.NET.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WebApplication3 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected override void CreateChildControls() 
     { 
      base.CreateChildControls(); 

      this.CreateRadioButtons(); 
     } 

     private void CreateRadioButtons() 
     { 
      var tblStars = new Table(); 
      tblStars.ID = "tblStars"; 

      ListItem opt1 = new ListItem(); 
      opt1.Text = "I like red"; 
      opt1.Value = "Red"; 

      ListItem opt2 = new ListItem(); 
      opt2.Text = "I like green"; 
      opt2.Value = "Green"; 

      ListItem opt3 = new ListItem(); 
      opt3.Text = "I like blue"; 
      opt3.Value = "Blue"; 

      var rb = new RadioButtonList(); 
      rb.ID = "RBQuestion_1"; 

      rb.Items.Add(opt1); 
      rb.Items.Add(opt2); 
      rb.Items.Add(opt3); 

      var tc = new TableCell(); 
      var tr = new TableRow(); 
      tc.Controls.Add(rb); 
      tr.Cells.Add(tc); 
      tblStars.Rows.Add(tr); 

      form1.Controls.Add(tblStars); 
     } 

     protected void btnSave_Click(object sender, EventArgs e) 
     { 
      var tblStars = this.form1.FindControl("tblStars") as Table; 
      if (tblStars == null) 
       return; 

      foreach (TableRow row in tblStars.Rows) 
      { 
       foreach (TableCell cell in row.Cells) 
       { 
        var rb = cell.FindControl("RBQuestion_1") as RadioButtonList; 
        if (rb == null) 
         continue; 

        var selectedValue = rb.SelectedValue; 
       } 
      } 
     } 
    } 
} 

Моя соответствующая страница разметка:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication3.WebForm1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" /> 
    </div> 
    </form> 
</body> 
</html> 
+0

спасибо за reply..if я создать динамическую таблицу в вышеуказанном способе bindForm, как я могу получить доступ к этой таблице в кнопке Сохранить обработчик события .Это не доступна в обработчике событий сохранения – adward

+0

Вам необходимо переопределить метод CreateChildControls. Ответ отредактирован, чтобы привести пример. –

+0

Работает ли метод CreateChildControls? –

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