Repeater中使用PlaceHolder触发ItemCommand事件问题
在Repeater中通过PlaceHolder动态添加的Button,点击之后不会触发ItemCommand事件。怎么样才能让placeHolder中添加的button也能触发ItemCommand事件?
aspx代码:
- C# code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <div> <%# Eval("ID") %>,<%# Eval("Name") %>, <asp:Button ID="btnAdd" runat="server" Text="Add" CommandName="add" CommandArgument='<%# Eval("ID") %>' /> <asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Enabled"></asp:PlaceHolder> </div> </ItemTemplate> </asp:Repeater> </div> </form></body></html>
CS代码:
- C# code
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace WebApplication1{ public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Repeater1.ItemCommand += new RepeaterCommandEventHandler(Repeater1_ItemCommand); if (!IsPostBack) { List<Entity> list = new List<Entity>() { new Entity() { ID = 1, Name = "aaa"}, new Entity() { ID = 1, Name = "bbb" }, new Entity() { ID = 1, Name = "bbb" } }; Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound); Repeater1.DataSource = list; Repeater1.DataBind(); } } protected override void OnInit(EventArgs e) { base.OnInit(e); } protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Entity entity = (Entity)e.Item.DataItem; PlaceHolder PlaceHolder1 = (PlaceHolder)e.Item.FindControl("PlaceHolder1"); Button btnCancel = new Button(); btnCancel.ID = "btnCancel" + entity.ID; btnCancel.CommandName = "cancel"; btnCancel.CommandArgument = entity.ID.ToString(); btnCancel.Text = "Cancel " + entity.Name; PlaceHolder1.Controls.Add(btnCancel); } } public class Entity { public int ID { get; set; } public string Name { get; set; } } protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { Response.Write(e.CommandName); } }}
[解决办法]
那些事件和控件最好在前台写。干嘛非得写在后台?
[解决办法]
一般是不建议在 Page_Init中作数据的绑定的
但是如果单单对楼主的这个例子
如下代码就可以解决问题了
注意:
Page_Load 中没有数据绑定的代码,
没有 IsPostBack,
相当于页面每次加载都重新绑定了Repeater1 ,
如果你的Repeater1 不会动态绑定(点击某个按钮后绑定),这种做法还是可取的
其他的代码没有变化
- C# code
protected void Page_Load(object sender, EventArgs e) { } protected override void OnInit(EventArgs e) { base.OnInit(e); Repeater1.ItemCommand += new RepeaterCommandEventHandler(Repeater1_ItemCommand); Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound); List<Entity> list = new List<Entity>() { new Entity() { ID = 1, Name = "aaa"}, new Entity() { ID = 1, Name = "bbb" }, new Entity() { ID = 1, Name = "bbb" } }; Repeater1.DataSource = list; Repeater1.DataBind(); }
[解决办法]
有一个方法你可以去试一试。
------------前台----------------------
前台js定义一个函数用来触发后台事件
__doPostBack('Reperater控件','');
这个方式应该可以唤醒Reperater控件的Repeater1_ItemDataBound事件。。
。。如果不知道这个方法你可以去了解下。。
--------------后台----------------------
把前台这个函数注册到新加的button的click事件当中去,相信这样可以唤醒Reperater控件的后台事件