2016-12-22 5 views
1

Ниже приведен код, к которому я стремлюсь. Мне нужен пользовательский элемент управления, который может привязываться к данным, но также содержит другой контент (так что достаточно простого повторителя). Конечной целью является что-то вдоль линий:Пользовательский контроль пользователя с повторяющимися данными

<MyControls:Control1 runat="server" id="Control1"> 
    <headertemplate> 
     <tr> 
      <td>ID</td> 
      <td>Username</td> 
     </tr> 
    </headertemplate> 
    <itemtemplate> 
     <tr> 
      <td><%#((User)Container.DataItem).ID %></td> 
      <td><%#((User)Container.DataItem).Username %></td> 
     </tr> 
    </itemtemplate> 
</MyControls> 

И:

var users = GetUsersList(); 
Control1.DataSource = users; 
Control1.DataBind(); 

И выглядит следующим образом:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl1.ascx.cs" Inherits="Controls.MyControl1" %> 

<asp:PlaceHolder runat="server" ID="Wrapper"> 

    <h2>Results</h2> 

    <table> 
     <%=HeaderTemplate%> 
     <% 
      if(ItemTemplate.AnyItems()){ 
       foreach(var item in ItemTemplate){ 

       } 
      } 
      else 
      { 
      %>Nothing here<% 
      } 
     %> 
    </table> 
    <MyControls:AnotherControl runat="server" /> 

</asp:PlaceHolder> 

Я нашел страницу на блоге ScottGu, что, как представляется, показать, что я хочу:
https://weblogs.asp.net/scottgu/Supporting-Templates-with-ASP.NET-User-Controls

Но связанный с учебником 404 сейчас! Все другие примеры, которые я нашел, не кажутся хорошо написанными и очень трудными для выбора.

Любая помощь в отношении того, как достичь вышеуказанного, будет высоко оценена.

+0

Что связанное учебное пособие вы не можете найти? – Pikoh

+0

На ScottGu, ссылки на http://90statehouse.com/forums/blogs/robertseder/archive/2006/06/04/201.aspx –

+1

Попробуйте это [ссылка] (https://web.archive.org/web/ 20060708013314/http: //90statehouse.com/forums/blogs/robertseder/archive/2006/06/04/201.aspx) – Pikoh

ответ

1

Похоже, вы получаете смешанные смешанные элементы управления. UserControl и Repeater (думаю).

Чтобы связать данные с элементом управления внутри UserControl, вам необходимо сделать этот элемент управления доступным для родителя. Вы можете сделать это, создав публичное свойство внутри UserControl.

public Repeater myRepeater 
{ 
    get 
    { 
     return Repeater1; 
    } 
    set 
    { 
     Repeater1 = value; 
    } 
} 

UserControl ASCX с повторителем

<table border="1"> 
    <asp:Repeater ID="Repeater1" runat="server"> 
     <HeaderTemplate> 
      <tr> 
       <td>ID</td> 
       <td>Username</td> 
      </tr> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <td><%# Eval("ID") %></td> 
       <td><%# Eval("Username") %></td> 
      </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
</table> 
<br /> 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<br /> 
<asp:Button ID="Button1" runat="server" Text="Button" /> 
<br /> 
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 

Теперь у вас есть доступ к Repeater1 в родителю из-за публичной собственности.

Control1.myRepeater.DataSource = users; 
Control1.myRepeater.DataBind(); 

И оставить контроль над родителем aspx пустым.

<MyControls:Control1 runat="server" id="Control1"></MyControls> 
+0

Спасибо за код, что делает ретранслятор внутри элемента управления, который является общедоступным, является одним из решений, но я пытаюсь скрыть все это внутри самого элемента управления. –

+0

Не делайте ретранслятор общедоступным, напишите некоторые методы и свойства пересылки/прокси в вашем пользовательском контроллере для доступа к ретранслятору. Больше усилий, чем публикация ретранслятора, да, но дает вам контроль над доступом к репитеру. – sh1rts

+0

@ Тома, содержащая все в элементе управления, как правило, делается. Но так как вы написали «Control1.DataSource = users;», похоже, вы хотели получить доступ к Repeater от родителя. Если нет, вы можете просто использовать 'myRepeater.DataSource = users;' в самом элементе управления. – VDWWD

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