2013-03-03 3 views
5

У меня есть ретранслятор в моей ASPX:Наполнение в ASP.NET Repeater

<asp:Repeater ID="rptDummy" runat="server" OnItemDataBound="rptDummy_OnItemDataBound" 
    Visible="true"> 
</asp:Repeater> 

в C# стороне полотна я написал эту функцию:

protected void createRadioButtons(DataSet ds){ 
    List<System.Web.UI.WebControls.RadioButton> buttons = new List<System.Web.UI.WebControls.RadioButton>(); 
    foreach (DataTable dt in ds.Tables){ 
      foreach (DataRow r in dt.Rows){ 
       System.Web.UI.WebControls.RadioButton rb = new System.Web.UI.WebControls.RadioButton(); 
       rb.Text = r[1] + " " + r[2] + " " + r[3] + " " + r[4]; 
       rb.GroupName = (string)r[5]; 
       buttons.Add(rb); 
      } 
     } 
     rptDummy.DataSource = buttons; 
     rptDummy.DataBind(); 
} 

Но при попытке его, он показывает ничего. Что я делаю неправильно?

+0

пост ASPX код повторителя, код, где выборки данных, и где вы называете этот метод? –

+1

Вы привязываете список переключателей к ретранслятору вместо данных. Если вы положили переключатель в повторителе itemTemplate и просто привязывали данные, вы должны были его получить. –

+1

В отличие от сайтов на форуме мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so ]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

ответ

12

Попробуйте это:

1 - Определить Repeater:

<asp:Repeater ID="rptDummy" runat="server" OnItemDataBound="rptDummy_OnItemDataBound" > 
    <ItemTemplate> 
     <asp:RadioButtonList ID="rbl" runat="server" DataTextField="Item2" DataValueField="Item2" /> 
    </ItemTemplate> 
</asp:Repeater> 

2 - Построить структуру данных и связать ретранслятор:

List<Tuple<string,string>> values = new List<Tuple<string,string>>(); 

foreach (DataTable dt in ds.Tables){ 
    foreach (DataRow r in dt.Rows){ 
     string text = r[1] + " " + r[2] + " " + r[3] + " " + r[4]; 
     string groupName = (string)r[5]; 
     values.Add(new Tuple<string,string>(groupName, text)); 
    } 
} 

//Group the values per RadioButton GroupName 
rptDummy.DataSource = values.GroupBy(x => x.Item1); 
rptDummy.DataBind(); 

3 - Определение Событие OnItemDataBound:

protected void rptDummy_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     IGrouping<string, Tuple<string, string>> group = (IGrouping<string, Tuple<string, string>>)e.Item.DataItem; 
     RadioButtonList list = (RadioButtonList)e.Item.FindControl("rbl"); 

     list.DataSource = group; 
     list.DataBind(); 
    } 
} 

Вы видите, каждый IGrouping<string, Tuple<string, string>> относится к группе радиокнопок определенной ИмяГруппы, они также элементы из ретранслятора. Для каждого элемента мы создаем новый RadioButtonList, который представляет всю группу RadioButtons.

Вы можете сделать это лучше с помощью другой структуры данных, чем Tuple, часто неясно, какие Item1 и Item2 средства.

UPDATE:

Если вы хотите увидеть выбранные значения:

protected void button_OnClick(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in rptDummy.Items) 
    { 
     RadioButtonList list = (RadioButtonList)item.FindControl("rbl"); 
     string selectedValue = list.SelectedValue; 
    } 
} 
+0

+1 что-то новое для меня –

+0

Отлично! Это работает! Теперь, как я могу «получить» все выбранные? – Javi

+0

Да, чтобы перебирать элементы Repeater, чтобы найти каждый список RadioButtonList. –

1

Вы должны поместить RadioButton в ретранслятор и связать его в событии createRadioButtons.

+0

Не могли бы вы быть более подробными? – Javi