2014-11-10 3 views
3

У меня есть 2 таблицы в SQL Server. В одной таблице есть список всех супергероев, а другая таблица - список способностей. В настоящее время во время выполнения дочерний ретранслятор получает все элементы в таблице, когда он должен получать только элементы, относящиеся к родительской таблице. На моей странице ASPX У меня есть вложенная повторитель так:Как связать свой вложенный репитер с его родителем на основе текущего идентификатора родителя?

<asp:Repeater id="rptHero" runat="server" DataSourceID="sdsHeros" OnItemDataBound="rptHero_ItemDataBound"> 
    <ItemTemplate> 
     <table> 
      <tr> 
      <td> <%# Eval("HeroName")%> </td>       
       <asp:Repeater id="rptAbility" runat="server" >     
        <ItemTemplate>      
        <tr> 
         <td> <%# Eval("AbilityName")%> </td>      
        </tr> 
        </ItemTemplate> 
       </asp:Repeater>    
      </tr> 
     </table> 
     <p>&nbsp;</p>    
    </ItemTemplate> 
</asp:Repeater> 
<asp:SqlDataSource ID="sdsHero" runat="server" ConnectionString="<%$ ConnectionStrings:SiteSqlServer2 %>" 
    SelectCommand="SELECT [num], [HeroName] FROM [Super_Heros]"></asp:SqlDataSource> 
<asp:SqlDataSource ID="sdsAbility" runat="server" ConnectionString="<%$ ConnectionStrings:SiteSqlServer2 %>" 
    SelectCommand="SELECT [num], [AbilityName] FROM [Super_Ability]"></asp:SqlDataSource> 

И в моем коде позади меня:

protected void rptHero_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     DataRowView row = (DataRowView)e.Item.DataItem; 

     Repeater nestedRepeater = e.Item.FindControl("rptAbility") as Repeater; 
     nestedRepeater.DataSource = sdsAbility; 
     nestedRepeater.DataBind(); 
    } 
} 

После Example 1 и Example 2 размещены нашими прекрасными меценатов здесь на переполнение стека это должно работать однако, я думаю, что часть, которую я пропускаю, где [num] родительского ретранслятора сравнивается с [HeroID] дочернего ретранслятора, как в SQLJoin.

ответ

2

Вот что я закончил с

<asp:Repeater id="repMenu1" runat="server" OnItemDataBound="repMenu1_ItemDataBound"> 
    <ItemTemplate> 
     <table id="gradient-style"> 
     <tr> 
      <th> <%#DataBinder.Eval(Container.DataItem, "Hero")%> </th> 
     </tr> 
     <asp:Repeater id="repMenu2" runat="server"> 
      <ItemTemplate> 
       <tr> 
       <td> <a href="ScoreGraphs.aspx?id=<%#DataBinder.Eval(Container.DataItem, "num")%>"> <%#DataBinder.Eval(Container.DataItem, "Abilities")%></a> </td> 
       </tr>  
      </ItemTemplate> 
     </asp:Repeater> 
     </table>  
    </ItemTemplate> 
</asp:Repeater> 

А в коде позади

protected void Page_Load(object sender, EventArgs e) 
{ 
    GetSQLData(); 
} 

//my custom function to get data and create relationship between 2 tables and 
//bind the data on page load so that when menu1 is databound, it will find the matching submenu  
//items in the database and bind them to the second (nested) repeater, 
//displaying the sub-menu items below the parent 

protected void GetSQLData() 
{ 
    using (SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["SiteSqlServer2"].ConnectionString)) 
    { 
     conn1.Open(); 
     SqlDataAdapter cmd = new SqlDataAdapter(@"SELECT * FROM [Abilities]; SELECT * FROM [Heros]", conn1); 
     DataSet ds = new DataSet(); 
     cmd.Fill(ds); 
     ds.Relations.Add(new DataRelation("nestThem", ds.Tables[0].Columns["num"], ds.Tables[1].Columns["AbilityID"])); 

     repMenu1.DataSource = ds; 
     repMenu1.DataBind(); 
    } 
} 

//Binding the data 
protected void repMenu1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    DataRowView dv = e.Item.DataItem as DataRowView; 
    if (dv != null) 
    { 
     Repeater repSubMenu = e.Item.FindControl("repMenu2") as Repeater; 
     if (repSubMenu != null) 
     { 
      repSubMenu.DataSource = dv.CreateChildView("nestThem"); 
      repSubMenu.DataBind(); 
     } 
    } 
} 

Я нашел это решение, чтобы быть простым и чистым.

+0

Мне пришлось настроить это чуть-чуть, чтобы работать, но это позволило решить около 98% моей проблемы. Благодаря! –

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

  • Нет связанных вопросов^_^