在Repeater中绑定的一个按钮控件,在Repeater的ItemDataBound事件的处理函数中为按钮的Command事件指定处理函数,但是在运行时,处理函数却无法被触发。高手看看这段代码到底错在哪里了?页面代码:
<asp:Repeater ID="rptPostil" Runat="server">
<ItemTemplate>
<asp:Button ID="btnTest" Runat="server" Text="测试绑定" CausesValidation="False" />
</ItemTemplate>
</asp:Repeater>C#代码:
private void Page_Load(object sender, System.EventArgs e)
{
if (this.rptPostil != null)
this.rptPostil.ItemDataBound += new RepeaterItemEventHandler(OnBindPostilDefinition);
}private void OnBindPostilDefinition(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
Button btn = (Button)e.Item.FindControl("btnTest");
if (btnDel != null)
{
btn.CommandName = "Test";
btn.Command += new CommandEventHandler(TestButtonCommanded);
}
}
}private void TestButtonCommanded(object sender, CommandEventArgs e)
{
if (e.CommandName == "Test")
{
((Label)this.FindControl("lblHeadline")).Text = "Test";
}
}单步运行时,发现点击Test按钮后,TestButtonCommanded函数没有被调用。这段代码到底错在什么地方了?
<asp:Repeater ID="rptPostil" Runat="server">
<ItemTemplate>
<asp:Button ID="btnTest" Runat="server" Text="测试绑定" CausesValidation="False" />
</ItemTemplate>
</asp:Repeater>C#代码:
private void Page_Load(object sender, System.EventArgs e)
{
if (this.rptPostil != null)
this.rptPostil.ItemDataBound += new RepeaterItemEventHandler(OnBindPostilDefinition);
}private void OnBindPostilDefinition(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
Button btn = (Button)e.Item.FindControl("btnTest");
if (btnDel != null)
{
btn.CommandName = "Test";
btn.Command += new CommandEventHandler(TestButtonCommanded);
}
}
}private void TestButtonCommanded(object sender, CommandEventArgs e)
{
if (e.CommandName == "Test")
{
((Label)this.FindControl("lblHeadline")).Text = "Test";
}
}单步运行时,发现点击Test按钮后,TestButtonCommanded函数没有被调用。这段代码到底错在什么地方了?
if (btnDel != null)
应为
if (btn != null)
{
if (e.CommandName == "Test")
{
((Label)this.FindControl("lblHeadline")).Text = "Test";
}
}
private void Page_Load(object sender, System.EventArgs e)
{
//去掉if试试
//if (this.rptPostil != null)
this.rptPostil.ItemDataBound += new RepeaterItemEventHandler(OnBindPostilDefinition);
}
页面每次postback要重建现场
<asp:Button ID="btnTest" Runat="server" Text="测试绑定" CausesValidation="False" />
</ItemTemplate>好像少了个CmmandName属性,把它设置成"edit",试试看,应该好用的
<table border="0" width="99%" cellpadding="3" cellpadding="1">
<asp:Repeater ID="rptPostil" Runat="server">
<ItemTemplate>
<tr height ="25"><td>
<asp:Button ID="btn" Runat="server" Text="Test Button Click" />
</td></tr>
</ItemTemplate>
</asp:Repeater>
</table>C#代码:
public class skin_Test : System.Web.UI.UserControl
{
private Repeater rptPostil; private void Page_Load(object sender, System.EventArgs e)
{
this.rptPostil = (Repeater)this.FindControl("rptPostil");
this.rptPostil.ItemDataBound +=new RepeaterItemEventHandler(OnBindPostilDefinition); ArrayList lst = new ArrayList();
lst.Add(1);
lst.Add(2); this.BindArrayListToRepeater(lst);
} private void BindArrayListToRepeater(ArrayList lst)
{
this.rptPostil.DataSource = lst;
this.rptPostil.DataBind();
} private void OnBindPostilDefinition(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
((Button)e.Item.FindControl("btn")).Click +=new EventHandler(TestButtonClicked);
}
} private void TestButtonClicked(object sender, EventArgs e)
{
Response.Write("Test Button Clicked!!");
}}