2013-08-02 79 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的:

<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> 

最後但並非最不重要的代碼隱藏:

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; 
       } 
      } 
     } 
    } 

由於你可以在代碼隱藏中看到,當我通過程序並進入「rb.checked」時,它會顯示正確的選項對於rb(例如:{Text =「Houston」Checked = false),即使Houston是選定的RadioButton也是如此。)

編輯:我已經跟蹤到了javascript函數。 javascript函數沒有將current.checked設置爲true。現在,我不知道爲什麼會在函數中明確地調用它時發生。任何建議或意見將不勝感激。

+0

潛在回發問題? –

+0

感謝您的建議!謹慎地闡述一下?你在哪裏看到回發問題的可能性? – imnotverygoodatthis

+0

只是一種直覺,再次看着它似乎不太可能,因爲你正在使用Javascript來設置屬性..我剛剛有一個問題,控制重置他們的屬性時發佈回來,而不是捕捉它 –

回答

1

如果其他人有同樣的問題,我找出我的錯誤在哪裏。在Page_Load中,我忘記了在if「不是PostBack」部分中爲Repeater設置DataSource和DataBind。 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

我的猜測是在click事件中對數據綁定的調用是重置值。如果我需要明確調用數據綁定,我會在控件更改事件後執行它,例如在LoadComplete http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx我曾經有這個問題相當多,但我現在明智(摸木頭)。

+0

感謝您花時間回答我的問題。我將DataBind從click事件中取出。我意識到我不需要再次調用它。但是,不幸的是,我仍然有一個問題讓按鈕顯示爲被點擊。搜索仍在繼續 – imnotverygoodatthis