2016-12-22 4 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(); 

그리고 다음과 같습니다 : I가 나타납니다 ScottGu의 블로그에 페이지를 발견했습니다

<%@ 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> 

내가 원하는 것을 보여주세요 :
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

에 대한 링크 [[link] (https://web.archive.org/web/)를 방문하십시오. 20060708013314/http : //90statehouse.com/forums/blogs/robertseder/archive/2006/06/04/201.aspx) – Pikoh

답변

1

2 개의 다른 컨트롤이 섞여있는 것처럼 보입니다. UserControlRepeater (제 생각).

데이터를 UserControl 내의 컨트롤에 바인딩하려면 해당 컨트롤을 부모로부터 액세스 할 수 있도록해야합니다. UserControl 내부에 public 속성을 만들어이 작업을 수행 할 수 있습니다.

<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에 액세스 할 수 Repeater 컨트롤과

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

에서 UserControl ASCX.

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

그리고 aspx 상위 컨트롤을 비워 두십시오.

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

코드를 사용해 주셔서 감사합니다. 공개적으로 액세스 할 수있는 컨트롤 내부의 리피터를 만드는 것이 하나의 솔루션이지만 컨트롤 자체 내에 모두 포함하려고합니다. –

+0

리피터를 공개적으로 액세스 할 수 없게 만들고, 리피터에 액세스하기 위해 사용자 컨트롤에 전달/프록시 메소드 및 속성을 작성하십시오. 중계기를 공개하는 것보다 많은 노력이 필요하지만 중계기에 액세스하는 방법을 제어 할 수 있습니다. – sh1rts

+0

@Tom, 컨트롤의 모든 것을 포함하는 것이 일반적입니다. 그러나 당신이'Control1.DataSource = users; '를 썼기 때문에 당신이 부모로부터 Repeater에 접근하기를 원하는 것처럼 보입니다. 그렇지 않은 경우에는 컨트롤 자체에서'myRepeater.DataSource = users; '를 사용할 수 있습니다. – VDWWD