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

そして、このようになります:私はに表示されます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 Repeater myRepeater 
{ 
    get 
    { 
     return Repeater1; 
    } 
    set 
    { 
     Repeater1 = value; 
    } 
} 

リピータコントロールとユーザーコントロール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

コードをお寄せいただきありがとうございます。公開されているコントロール内のリピーターを1つの解決策にしていますが、コントロール内にすべてを収めようとしています。 –

+0

リピータに一般にアクセス可能にしないでください。リピータにアクセスするために、ユーザコントロールにいくつかの転送/プロキシのメソッドとプロパティを記述してください。リピータを公開するよりも多くの努力が必要ですが、リピータへのアクセス方法を制御できます。 – sh1rts

+0

@Tom、コントロール内のすべてを含んでいるのは、通常どのように行われたかです。しかし、あなたは 'Control1.DataSource = users; 'を書いたので、親からRepeaterにアクセスしたかったようです。もしそうでなければ、コントロール自体に 'myRepeater.DataSource = users;'だけを使うことができます。 – VDWWD

関連する問題