<
asp:repeater
id
="Repeater1"
runat
="server"
onitemcommand
="Repeater1_ItemCommand"
onitemcreated
="Repeater1_ItemCreated"
>
< headertemplate >
< table border ="1" >
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< asp:button id ="Button1" runat ="server" commandname ="Button1" text ="Button1" /></ td >
</ tr >
</ headertemplate >
< itemtemplate >
< tr >
< td > <% # Eval("ItemID") %> </ td >
< td > <% # Eval("ItemName") %> </ td >
< td >< asp:linkbutton id ="LinkButton1" runat ="server" commandname ="LinkButton1" text ="LinkButton1" /></ td >
</ tr >
</ itemtemplate >
< footertemplate >
</ table >
</ footertemplate >
</ asp:repeater >
< headertemplate >
< table border ="1" >
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< asp:button id ="Button1" runat ="server" commandname ="Button1" text ="Button1" /></ td >
</ tr >
</ headertemplate >
< itemtemplate >
< tr >
< td > <% # Eval("ItemID") %> </ td >
< td > <% # Eval("ItemName") %> </ td >
< td >< asp:linkbutton id ="LinkButton1" runat ="server" commandname ="LinkButton1" text ="LinkButton1" /></ td >
</ tr >
</ itemtemplate >
< footertemplate >
</ table >
</ footertemplate >
</ asp:repeater >
加载数据:
public
DataTable CreateDataTable(
int
count)
{
DataTable tbl = new DataTable();
tbl.Columns.Add( "ItemID", typeof(int) );
tbl.Columns.Add( "ItemName", typeof(string) );
DataRow row;
int i = count;
while (i-- > 0)
{
row = tbl.NewRow();
row[0] = i;
row[1] = "Item#" + i.ToString();
tbl.Rows.Add( row );
}
return tbl;
}
protected void Page_Load( object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Repeater1.DataSource = CreateDataTable(10);
Repeater1.DataBind();
}
}
{
DataTable tbl = new DataTable();
tbl.Columns.Add( "ItemID", typeof(int) );
tbl.Columns.Add( "ItemName", typeof(string) );
DataRow row;
int i = count;
while (i-- > 0)
{
row = tbl.NewRow();
row[0] = i;
row[1] = "Item#" + i.ToString();
tbl.Rows.Add( row );
}
return tbl;
}
protected void Page_Load( object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Repeater1.DataSource = CreateDataTable(10);
Repeater1.DataBind();
}
}
Repeate的ItemCreated事件:
protected
void
Repeater1_ItemCreated(
object
sender, RepeaterItemEventArgs e)
{
Button btn1 = e.Item.FindControl( "Button1" ) as Button;
if (btn1 != null)
{
// do nothing, just to access the ClientID owing to the button
//
string temp = btn1.ClientID;
}
LinkButton lnkbtn1 = e.Item.FindControl( "LinkButton1" ) as LinkButton;
if (lnkbtn1 != null)
{
// do nothing, just to access the ClientID owing to the linkbutton
//
string temp = lnkbtn1.ClientID;
}
}
{
Button btn1 = e.Item.FindControl( "Button1" ) as Button;
if (btn1 != null)
{
// do nothing, just to access the ClientID owing to the button
//
string temp = btn1.ClientID;
}
LinkButton lnkbtn1 = e.Item.FindControl( "LinkButton1" ) as LinkButton;
if (lnkbtn1 != null)
{
// do nothing, just to access the ClientID owing to the linkbutton
//
string temp = lnkbtn1.ClientID;
}
}
Repeater的ItemCommand事件:
protected
void
Repeater1_ItemCommand(
object
source, RepeaterCommandEventArgs e)
{
Response.Write( "CommandName: " + e.CommandName );
}
{
Response.Write( "CommandName: " + e.CommandName );
}
运行结果:
Problem:
然而,非常奇怪的是 HeaderTempate里面的Button和ItemTemplate里面的LinkButton都不会激发Repeater的ItemCommand了。
经过多次的尝试,发现,只要在ItemCreated访问了 内嵌的 Control的ClientID,改Control的ClientID就不会改变了,即使父控控件实现了INamingContainer接口。
查看页面生成的HTML源:
<
table
border
="1"
>
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< input type ="submit" name ="Button1" value ="Button1" id ="Button1" /></ td >
</ tr >
< tr >
< td > 9 </ td >
< td > Item#9 </ td >
< td >< a id ="LinkButton1" href ="javascript:__doPostBack('LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > 8 </ td >
< td > Item#8 </ td >
< td >< a id ="LinkButton1" href ="javascript:__doPostBack('LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< input type ="submit" name ="Button1" value ="Button1" id ="Button1" /></ td >
</ tr >
< tr >
< td > 9 </ td >
< td > Item#9 </ td >
< td >< a id ="LinkButton1" href ="javascript:__doPostBack('LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > 8 </ td >
< td > Item#8 </ td >
< td >< a id ="LinkButton1" href ="javascript:__doPostBack('LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
注释掉ItemCreated中访问ClientID代码:
protected
void
Repeater1_ItemCreated(
object
sender, RepeaterItemEventArgs e)
{
Button btn1 = e.Item.FindControl( "Button1" ) as Button;
if (btn1 != null)
{
// do nothing, just to access the ClientID owing to the button
//
//string temp = btn1.ClientID; // comment this
}
LinkButton lnkbtn1 = e.Item.FindControl( "LinkButton1" ) as LinkButton;
if (lnkbtn1 != null)
{
// do nothing, just to access the ClientID owing to the linkbutton
//
//string temp = lnkbtn1.ClientID; // comment this
}
}
{
Button btn1 = e.Item.FindControl( "Button1" ) as Button;
if (btn1 != null)
{
// do nothing, just to access the ClientID owing to the button
//
//string temp = btn1.ClientID; // comment this
}
LinkButton lnkbtn1 = e.Item.FindControl( "LinkButton1" ) as LinkButton;
if (lnkbtn1 != null)
{
// do nothing, just to access the ClientID owing to the linkbutton
//
//string temp = lnkbtn1.ClientID; // comment this
}
}
生成的HTML源:
<
table
border
="1"
>
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< input type ="submit" name ="Repeater1:_ctl0:Button1" value ="Button1" id ="Repeater1__ctl0_Button1" /></ td >
</ tr >
< tr >
< td > 9 </ td >
< td > Item#9 </ td >
< td >< a id ="Repeater1__ctl1_LinkButton1" href ="javascript:__doPostBack('Repeater1$_ctl1$LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > 8 </ td >
< td > Item#8 </ td >
< td >< a id ="Repeater1__ctl2_LinkButton1" href ="javascript:__doPostBack('Repeater1$_ctl2$LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > ItemID </ td >
< td > ItemName </ td >
< td >< input type ="submit" name ="Repeater1:_ctl0:Button1" value ="Button1" id ="Repeater1__ctl0_Button1" /></ td >
</ tr >
< tr >
< td > 9 </ td >
< td > Item#9 </ td >
< td >< a id ="Repeater1__ctl1_LinkButton1" href ="javascript:__doPostBack('Repeater1$_ctl1$LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
< tr >
< td > 8 </ td >
< td > Item#8 </ td >
< td >< a id ="Repeater1__ctl2_LinkButton1" href ="javascript:__doPostBack('Repeater1$_ctl2$LinkButton1','')" > LinkButton1 </ a ></ td >
</ tr >
对比一下发现,Button的客户端ID不一样,猜想下原因可能是由于 ClientID不符合NameContainer规则,PostBack以后无法找到事件控件源。
Any Solutions?