2011-02-28 54 views
3

我有用戶控制無線電選項組名問題在動態加載用戶控制ASP.net

<table style="border-width: 0"> 
    <tr> 
     <td style="vertical-align: middle;"> 
      <asp:RadioButton ID="rdOption" runat="server" Text="I m testing" 
       GroupName="Questions" oncheckedchanged="rdOption_CheckedChanged" 
       AutoPostBack="True"/> 
     </td> 
     <td style="vertical-align: middle; padding-left: 10px"> 
      <asp:TextBox ID="txtOthers" runat="server" CssClass="txtbox" Visible="false"></asp:TextBox> 
     </td> 
    </tr> 
</table> 

protected void Page_Load(object sender, EventArgs e) 
    { 
     rdOption.GroupName = "myGroup"; 
     rdOption.Text = Option.OptionDesc; 
    } 

上Survery.aspx予加載的用戶控制動態

foreach (clsOptions option in _CurrentQuestion.Options) 
     { 
      UserControls_OptionField ctrl = Page.LoadControl("~/UserControls/OptionField.ascx") as UserControls_OptionField; 
      ctrl.Option = option; 
      pnlOption.Controls.Add(ctrl); 
     } 

問題是,每個選項都有下面顯示了不同的組名稱。這就是爲什麼選項無法正常工作,並且在MCQ中可以選擇所有選項時,只能選擇一個選項。

<input id="ContentPlaceHolder1_ctl01_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl01$myGroup" value="rdOption"> 

<input id="ContentPlaceHolder1_ctl02_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl02$myGroup" value="rdOption"> 

enter image description here

回答

2

我認爲這是一個bug這是在ASP.Net自1.0(真棒,他們已經完全忘記了^^)。

你可以嘗試以下適用於Repeater(或任何數據綁定控件)的解決方案,但也應該適用於動態UserControls。

問題是,ASP.Net爲不同的NamingContainers呈現不同的唯一名稱,因此RadioButton會得到不同的GroupNames。

http://weblogs.asp.net/joseguay/archive/2008/07/24/having-radiobuttons-on-a-repeater-or-datalist.aspx

將這個在您的網頁的頭部部分:

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

的客戶方onclick事件添加到單選按鈕使用適當的參數:

string script = "SetUniqueRadioButton('rdOption.*myGroup',this)"; 
rdOption.Attributes.Add("onclick", script); 

[未測試]

0

你需要在每個單選按鈕的「組名」屬性設置爲同樣的事情。

編輯:如果您使用.net 4,那麼我認爲使用ClientIDMode屬性來控制ID將工作。否則,你正在做的是在asp.net中的一個已知問題(通常通過將單選按鈕放在中繼器/列表視圖中)。

您將需要製作自己的控件並實現INamingContainer接口,以便爲您的收音機工作或在不使用usercontrol的情況下使用RadioButtonGroup。我也看到了一些使用JavaScript來強制執行一種選擇模式的解決方案。

+0

我已經在用戶控件加載事件中將它設置爲rdOption.GroupName =「myGroup」; – 2011-02-28 20:57:54

+2

probelem是ASP.net連接前綴ctl00 $ ContentPlaceHolder1 $ ctl01 – 2011-02-28 20:58:31

3

正如所有的建議,這是通過設計,後來被認爲是一個錯誤。

控制Joel的建議是如此之大,除了覆蓋整個渲染邏輯,所以在寫入該控件後框架中的任何增強都不會使用。

所以,我建議用替換Render()方法在其他控制:

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     using (var stringWriter = new StringWriter()) 
     using (var htmlWriter = new HtmlTextWriter(stringWriter)) 
     { 
      base.Render(htmlWriter); 
      var tagText = stringWriter.ToString(); 

      tagText = Regex.Replace(tagText, "name=\"(\\S+)\"", "name=\"" + GroupName + "\""); 

      writer.Write(tagText); 
     } 
    } 

的好處是能夠把所有多餘的東西可能來自基地渲染。

請注意,您可以:

  • 添加另一個屬性類,使這個不同的渲染行爲可選的基於屬性是否設置

  • 讓所有<asp:RadioButton:聲明指你自定義控件,無需更改它們,通過web.config:

<system.web> 
    <pages> 
     <tagMapping> 
     <add tagType="System.Web.UI.WebControls.RadioButton" mappedTagType="WebformsLibrary.CustomRadioButton" /> 
     </tagMapping> 
    </pages> 
    </system.web> 

其中WebformsLibrary.CustomRadioButton是類。

+0

這很棒。我一定會使用這個。謝謝! +1 – 2011-02-28 22:53:05

+0

只要記得使用'IPostBackDataHandler'和'Value'覆蓋,否則它可能無法工作。我做的唯一改變是'Render'繼續擁有框架的好處,而不是覆蓋它。 – Meligy 2011-02-28 23:04:47

+0

請稍後告訴是否這是對問題的正確答案:) – Meligy 2011-03-02 01:58:36

0

我發現這個解決方案更好。它類似於Tim Schmelter的solution,但我認爲將名稱設置爲它的意思會更容易,所以當您使用它或查看它時,這是您的期望,而且您不必手動設置每次單擊單選按鈕時是否檢查每個單選按鈕。

function fixRadioButtons(s, e) { 
    var re = /^(?:.*\$)?(.*)$/; 
    for (i = 0; i < document.forms[0].elements.length; i++) { 
     var elm = document.forms[0].elements[i]; 
     if (elm.type == 'radio') { 
      var match = re.exec(elm.name); 
      elm.name = match[1]; 
     } 
    } 
} 

然後通過JS調用回發的功能 - reference

// This code runs a function on postback 
var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_endRequest(fixRadioButtons); 

AND/OR:在後面的代碼(VB.NET) - reference

ClientScript.RegisterStartupScript(Me.GetType(), "Javascript", "fixRadioButtons(null, null);", True) 

請注意,如果您希望它每次都運行,而不僅僅是回發,那麼無論如何,您可能都需要使用ClientScript.RegisterStartupScript