以下是我瞄准的代码。我需要一个可以绑定数据的自定义用户控件,但也包含其他内容(因此只需一个原始转发器就不够了)。最终目标是:
<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 :(得分:1)
看起来你正在混淆2个不同的控件。 UserControl
和Repeater
(我认为)。
要将数据绑定到UserControl中的Control,您需要从父级访问该Control。您可以通过在UserControl中创建公共属性来完成此操作。
public Repeater myRepeater
{
get
{
return Repeater1;
}
set
{
Repeater1 = value;
}
}
UserControl ascx与Repeater Control
<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>