2010-10-27 35 views

Odpowiedz

1

Wystarczy dodać OnCheckedChanged zdarzenie do przycisku radiowego, pętla wszystkie radiobuttons w repeatera aby je odznaczyć. Możesz użyć UpatePanel, jeśli nie chcesz otrzymywać odświeżania.

.aspx

<asp:Repeater ID="Repeater1" runat="server" > 
    <ItemTemplate> 
     <asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_OnCheckedChanged" AutoPostBack="true" /> 
    </ItemTemplate> 
</asp:Repeater> 

.cs

protected void RadioButton1_OnCheckedChanged(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in Repeater1.Items) 
    { 
     RadioButton rbtn = (RadioButton)item.FindControl("RadioButton1"); 
     rbtn.Checked = false; 
    } 
    ((RadioButton)sender).Checked = true; 
} 
+1

W powyższym przykładzie, jeśli dodać właściwość „GROUPNAME” do kontroli , Doda wszystkie radioButton w tej samej grupie, więc tylko jeden przycisk radiowy zostanie wybrany. – Shivkant

+0

o tak ... zamiast tego powinniśmy użyć tego! – bla

+0

UpdatePanel będzie nadal powodować odświeżenie, tylko, że będzie odświeżenie ajax. Będzie to wymagało czasu, ponieważ musi dotrzeć do/z serwera. – nealkernohan

10

Niestety, jest to znany błąd (http://support.microsoft.com/kb/316495), że nieruchomość GroupName nie działa zgodnie z oczekiwaniami, gdy używany w Repeater . Problem polega na tym, że program Repeater implementuje interfejs INamingContainer, który wymaga, aby wszystkie zagnieżdżone formanty miały niepowtarzalną nazwę o unikalnej nazwie po wyrenderowaniu w HTML. Powoduje to przerwanie przycisków radiowych, ponieważ aby mogły one prawidłowo działać, muszą mieć identyczne nazwy: o identycznych nazwach:.

Istnieją 2 obejścia że Natknąłem:

1 - Pierwszy jest po stronie klienta JavaScript rozwiązaniem. Dostarczył go Microsoft support. Lub łatwiejsza do odczytania wersja here. Instrukcje są następujące. Zawierać następujące JavaScript w głowicy:

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

Teraz funkcja musi być powiązana z przycisków radiowych w przypadku OnDataItemBound z repeatera. Zamień „RadioButton” z nazwą swojej kontroli RadioButton i „radiogroup” z GroupName zostały wybrane:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
     if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return; 
     RadioButton rb = (RadioButton) e.Item.FindControl("RadioButton"); 
     string script = "SetUniqueRadioButton('Repeater1.*RadioGroup',this)"; 
     rb.Attributes.Add("onclick", script); 
} 

2 - Drugie rozwiązanie jest rozwiązaniem po stronie serwera przy użyciu niestandardowych usercontrol, która dziedziczy RadioButton. Samouczek i kod źródłowy można pobrać tutaj: http://www.codeproject.com/KB/webforms/How_group_RButtons.aspx

0

Wiem, że jest stary, ale powodem, dla którego przyciski nie działają, jest to, że atrybut nazwy jest nadpisywany. Jeśli używasz jQuery, możesz przypisać przycisk opcji do klasy, a następnie ustawić atrybut nazwy, aby zastąpić nową nazwę.

$('.MyRadioClass').attr("name","MyFixedName"); 
0

Inna prostsza alternatywa, gdzie nie jest wymagana żadna fantazyjny formatowania, jest użycie RadioButtonList:

<asp:RadioButtonList ... /> 
Powiązane problemy