读书人

Repeater中使用PlaceHolder触发ItemCo

发布时间: 2012-06-13 12:30:18 作者: rapoo

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控件的后台事件

读书人网 >asp.net

热点推荐