嗯,这不是一个那么简单的任务。在您的情况下,您需要完全自定义转发器,您需要访问控件并更改它们的属性,您需要拥有按钮并将事件处理程序分配给它们。
所以我的回答可能有点长,但我认为你们都需要完全自定义ASP.NET Repeater。
请按照这个答案一步一步来。
假设
我们有一个包含两列的表:绑定到中继器的 ID 和标题。
-
我们有一个这样的 ASPX 页面:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Repeater ID="rptMyRepeater" ClientIDMode="AutoID" runat="server" OnItemDataBound="rptMyRepeater_ItemDataBound" OnItemCommand="rptMyRepeater_ItemCommand" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:TextBox ID="txtMyTextBox" runat="server"></asp:TextBox>
<asp:Button ID="btnSowID" CommandName="ShowID" runat="server" Text="Show ID" />
<asp:Button ID="btnShowTitle" CommandName="ShowTitle" runat="server" Text="Show Title" />
<br /><br />
</ItemTemplate>
</asp:Repeater>
<asp:Label ID="lblMsg" runat="server" Text=""></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:postdataConnectionString %>" SelectCommand="SELECT * FROM [Titles]"></asp:SqlDataSource>
Repeater 内部有 3 个控件:两个 Button 和一个 TextBox,Repeater 外部有 Label (lblMsg)。
情景:
- 我们希望在文本框中显示标题。
- 奇数 ID 显示按钮,偶数 ID 隐藏按钮。
-
通过单击每个按钮,在 lblMsg 中显示相关行的 ID 或标题。
我认为这个场景涵盖了所有其他场景,您可以修改代码来执行任何其他操作。
演练:
1.为了达到第一个目标,我们使用ItemDataBound事件处理程序:
protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox;
txtMyTextBox.Text = dataItem.Row["Title"].ToString();
}
}
在上面我们在Repeater中找到TextBox并从数据库中分配Title Column。
输出:
2.现在我们要为奇数 ID 显示按钮并为偶数 ID 隐藏它们,因此也添加此部分:
Button btnSowID = e.Item.FindControl("btnSowID") as Button;
Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button;
if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0)
{
btnSowID.Visible = false;
btnShowTitle.Visible = false;
}
在上面我们在Repeater中找到btnSowID和btnShowTitle,并检查该行的ID是否甚至因此将相关按钮的可见性设置为false。
很明显,您可以实现任何其他条件。例如,如果当前用户是管理员,则显示按钮。
输出:
3.现在我们要为Repater中的每个Button添加Click Handler。正如您在 ASPX 代码中看到的,我们为按钮设置了 CommandName 属性,我们将来会使用此属性。
最终目标是单击每个按钮,lblMsg 向我们显示相关按钮单击的同一行的 ID 或标题。所以我们需要识别被点击的Button所在的行。
为了达到这一点,我们将相关的 ID 或 Title 值分配给 ItemDataBound 处理程序下每个 Button 的 CommandArgument 属性。
所以最后的ItemDataBound一定是这样的:
protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox;
txtMyTextBox.Text = dataItem.Row["Title"].ToString();
Button btnSowID = e.Item.FindControl("btnSowID") as Button;
btnSowID.CommandArgument = dataItem.Row["ID"].ToString();
Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button;
btnShowTitle.CommandArgument = dataItem.Row["Title"].ToString();
if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0)
{
btnSowID.Visible = false;
btnShowTitle.Visible = false;
}
}
}
为了捕捉Repeater内部按钮的点击事件,我们使用ItemCommand处理程序。这个处理程序帮助我们捕获和处理中继器内的控件事件。
所以我们像这样定义ItemCommand Handler:
protected void rptMyRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
switch (e.CommandName)
{
case "ShowID":
lblMsg.Text = e.CommandArgument.ToString();
break;
case "ShowTitle":
lblMsg.Text = e.CommandArgument.ToString();
break;
}
}
在上面,我们检查了在 ASPX 代码中手动设置的 CommandName 属性,并确定单击的是 ShowID 按钮或 ShowTitle 按钮。
当我们在第一步中找到它时,然后尝试找到 Button 放置在哪一行。于是我们读取了CommandArgument在ItemDataBoundHandler下动态设置的属性。
您还可以使用此方法创建 btnEdit 和 btnRemove 等按钮,将 CommandNames 设置为 Edit 和 Remove 并将 CommandArgument 设置为 Row ID,并在 ItemCommand Handler 下的数据库中执行更新或删除。
输出: