2013-08-02 3 views
1

Я пишу WebApplication, который имеет список элементов управления RadioButton, динамически генерируемых на основе информации из базы данных. Моя проблема заключается в том, что RadioButton, который я «проверяю», не отображается как проверенный.Динамически созданная радио кнопка не отображается Проверено ASP.NET

HTML:

<asp:CustomValidator ID="vgCheckRequiredChoice" Display="Static" runat="server" ValidationGroup="vgTicketTypeChoice" 
    Text="You must select an office location to continue." ForeColor="Red"></asp:CustomValidator> 
<table style="padding: 10px 10px 10px 10px; width: 100%" cellpadding="5px 5px 5px 5px"> 
    <asp:Repeater ID="rptType" runat="server" OnItemDataBound="rptType_ItemDataBound"> 
     <ItemTemplate> 
      <tr style="border-bottom: solid 1px #000000; padding: 40px 10px 10px 10px;"> 
       <td style="width: 30%;"> 
        <asp:RadioButton runat="server" ID="RadioButtonLocation" Text='<%# Bind("LocationName") %>' 
        GroupName='<%# Bind("LocationID") %>' ValidationGroup="vgTicketTypeChoice" 
        CausesValidation="true" /> 
       </td> 
      </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
</table> 
<div style="float: right; display: inline; padding-right: 20px; padding-top: 20px;"> 
    <asp:Button runat="server" ID="ButtonCancel" Text="Cancel" PostBackUrl="~/Default.aspx" /> 
    <asp:Button runat="server" ID="ButtonDefiningLocation" Text="Next >>"OnClick="ButtonDefiningLocation_Click" /> 
</div> 

Вот JavaScript, который я использую, чтобы проверить каждый уникальный RadioButton:

<script type="text/javascript"> 
    function SetUniqueRadioButton(nameregex, current) { 
     re = new RegExp(nameregex); 
     for (i = 0; i < document.forms[0].elements.length; i++) { 
      elm = document.forms[0].elements[i] 
      if (elm.type === 'radio') { 
       if (re.test(elm.name)) { 
        elm.checked = false; 
       } 
      } 
     } 
     current.checked = true; 
    } 
</script> 

Последнее, но не менее CodeBehind:

protected void rptType_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) 
      return; 
     RadioButton rdo = (RadioButton)e.Item.FindControl("RadioButtonLocation"); 
     string script = 
      "SetUniqueRadioButton('rptType.*VisitingOffice',this)"; 
     rdo.Attributes.Add("onclick", script); 
    } 

    protected void ButtonDefiningLocation_Click(object sender, EventArgs e) 
    { 
     rptType.DataBind(); 
     if (Page.IsValid) 
     { 
      foreach (RepeaterItem ri in rptType.Items) 
      { 
       switch (ri.ItemType) 
       { 
        case ListItemType.Item: 
        case ListItemType.AlternatingItem: 
         RadioButton rb = (RadioButton)ri.FindControl("RadioButtonLocation"); 
         if (rb.Checked) 
         { 
          var LocationID = rb.GroupName; 
          DataService ds = new DataService(); 
          DataTable tbl = ds.GetLocation(LocationID); 
          Response.Write(LocationID); 

         } 
         break; 
       } 
      } 
     } 
    } 

As вы можете видеть, в коде, когда я прохожу через программу и перехожу к «rb.checked», она отобразит правильные параметры для rb (Пример: {Text = "Houston" Checked = false}, даже если Хьюстон является выбранным RadioButton.)

EDIT: Я отследил его до функции javascript. Функция javascript не устанавливает current.checked равным true. Теперь я понятия не имею, почему это происходит, когда оно явно вызывается в функции. Любые предложения или советы будут высоко оценены.

+0

Вопрос о возврате потенциально? –

+0

Спасибо за предложение! Поразмыслить немного? Где вы видите возможность обратной проблемы? – imnotverygoodatthis

+0

Было просто ощущение кишки, глядя на него снова, кажется маловероятным, поскольку вы используете Javascript для установки атрибутов. У меня только что возникла проблема с элементами управления, сбросив их атрибуты при отправке назад и не поймав его. –

ответ

1

Если у кого-то еще такая же проблема, я понял, где моя ошибка. В Page_Load я забыл установить DataSource и DataBind для повторителя в разделе if is not PostBack. PageLoad должен выглядеть следующим образом.

protected void Page_Load(object sender, EventArgs e) 
    { 
     var FormattingPlaceHolder = Master.FindControl("BottomLinkButtonDiv"); 
     FormattingPlaceHolder.Visible = false; 
     if(!IsPostBack) 
     { 
     var ds = new DataService(); 
     rptType.DataSource = ds.GetLocationIDs(); 
     rptType.DataBind(); 
     } 
    } 

Спасибо всем за их предложения. Счастливое кодирование.

0

Я предполагаю, что вызов привязки данных в событии клика сбрасывает значения. Если мне нужно явно вызывать привязку данных, я делаю это после изменения изменений событий, например. В LoadComplete http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx У меня была эта проблема довольно много, но теперь я ей мудр (коснитесь дерева).

+0

Спасибо, что нашли время ответить на мой вопрос. Я извлек DataBind из события click. Я понял, что мне не нужно снова звонить. Но, к сожалению, у меня все еще возникает проблема с нажатием кнопки. Поиск продолжается – imnotverygoodatthis

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