[转]动态创建控件时, 控件事件无法触发的问题. --- 转自: http://www.tzwhx.com/NewShow/newBodyShow/%BF%D8%BC%FE_30673.html
根据Asp.NET的机制,在html markup有写DropDownList控件与动态加载的控件有点不一样。如果把DropDownList控件写在html markup,即.aspx网页,网友的代码是没有问题的。但是,如果是在.aspx.cs动态加载的控件,那就不能使用Page_Load事件内加载,如果以此加载,就算是使用AutoPostBack = true也没有效果。
正确做法是在Page_Init事件中加载。
下面动态实时操作中,首先是运行网友的代码,确定无法运行。然后Insus.NET把Page_Load事件以及Showpage方法Comment out之后,并把动态产生DropDownList控件拷贝至page_Init事件。最后奇迹发生,能正确运行了。
//类似的问题
动态添加SelectedIndexChanged事件 Web 技术 > ASP.NET 与 AJAX Pergunta Question Entrar para Votar 0 Entrar para Votar <table id="tb" runat="server" width="100%"> <tr> <td>AAA</td> <td><asp:DropDownList ID="ddl" runat="server" OnSelectedIndexChanged="ddl_SelectedIndexChanged" AutoPostBack="true"> <asp:ListItem Value="0" Text="卡卡"></asp:ListItem> <asp:ListItem Value="1" Text="帕托"></asp:ListItem> </asp:DropDownList> </td> </tr> </table> protected void ddl_SelectedIndexChanged(object sender, EventArgs e) { HtmlTableRow tr; HtmlTableCell tdleft; HtmlTableCell tdright; switch (ddl.SelectedValue) { case "0": tdleft = new HtmlTableCell(); Label lbl = new Label(); lbl.ID = "lbl"; lbl.Text = "aaa"; tdleft.Controls.Add(lbl); tdright = new HtmlTableCell(); DropDownList drop = new DropDownList(); drop.ID = "drop"; drop.Items.Add(new ListItem("0", "0")); drop.Items.Add(new ListItem("1", "1")); drop.SelectedIndexChanged += new EventHandler(drop_Selected); drop.AutoPostBack = true; tdright.Controls.Add(drop); tr = new HtmlTableRow(); tr.Cells.Add(tdleft); tr.Cells.Add(tdright); this.tb.Rows.Add(tr); break; } } protected void drop_Selected(object sender, EventArgs e) { Response.Write("<script>alert('1')</script>"); } 请问为什么我的drop下拉菜单索引改变的时候不执行drop_Selected事件? 我断点调试了一下 不管那个下拉菜单的索引改变都是执行的 ddl_SelectedIndexChanged事件 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:03 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Respostas Question Entrar para Votar 1 Entrar para Votar 你好,下面是刚写的一段示例,你看看, 这样的方式现在已经很少用了,一般都用 Ajax // HTML //-------------------------------------------------------------------------------------------------------- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200905141009.aspx.cs" Inherits="DropDown_X200905141009" %> <!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> <table style="width:300px;"> <tr> <td> <asp:DropDownList ID="fList1" runat="server" AutoPostBack="True" onselectedindexchanged="fList1_SelectedIndexChanged"> <asp:ListItem>0</asp:ListItem> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> </td> <td id="fTdContainer" runat="server"> </td> </tr> </table> </div> </form> </body> </html> // CS //-------------------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class DropDown_X200905141009 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { if (ViewState["IsBuild"] != null && (bool)ViewState["IsBuild"]) { // 回发生 fList2 会消失,在这里重新添加 fList2 this.BuildList(); } } } protected void fList1_SelectedIndexChanged(object sender, EventArgs e) { ViewState["IsBuild"] = true; this.BuildList(); } private void BuildList() { DropDownList fList2 = new DropDownList(); fList2.EnableViewState = true; fList2.ID = "fList2"; fList2.Items.Add(new ListItem("0", "0")); fList2.Items.Add(new ListItem("1", "1")); fList2.Items.Add(new ListItem("2", "2")); fList2.AutoPostBack = true; this.fTdContainer.Controls.Add(fList2); fList2.SelectedIndexChanged += new EventHandler(fList2_SelectedIndexChanged); } protected void fList2_SelectedIndexChanged(object sender, EventArgs e) { // 如果没有在回发时重建 fList2 FindControl 方法将找不到 fList2 DropDownList fList2 = (DropDownList)this.FindControl("fList2"); Response.Write(string.Format("<script>alert('{0}')</script>", fList2.SelectedValue)); } } 知识改变命运,奋斗成就人生! Marcado como Resposta 米兰卡卡 sábado, 16 de maio de 2009 07:54 quinta-feira, 14 de maio de 2009 06:37 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Todas as Respostas Question Entrar para Votar 1 Entrar para Votar 你好,PageLoad 中加入 protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { if (drop.SelectedValue == "0") drop.SelectedIndexChanged += new EventHandler(drop_Selected); } } protected void ddl_SelectedIndexChanged(object sender, EventArgs e) { HtmlTableRow tr; HtmlTableCell tdleft; HtmlTableCell tdright; switch (ddl.SelectedValue) { case "0": tdleft = new HtmlTableCell(); Label lbl = new Label(); lbl.ID = "lbl"; lbl.Text = "aaa"; tdleft.Controls.Add(lbl); tdright = new HtmlTableCell(); DropDownList drop = new DropDownList(); drop.ID = "drop"; drop.Items.Add(new ListItem("0", "0")); drop.Items.Add(new ListItem("1", "1")); drop.AutoPostBack = true; tdright.Controls.Add(drop); tr = new HtmlTableRow(); tr.Cells.Add(tdleft); tr.Cells.Add(tdright); this.tb.Rows.Add(tr); break; } } protected void drop_Selected(object sender, EventArgs e) { Response.Write("<script>alert('1')</script>"); } 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:17 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 好像还是没有执行 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:28 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 是可以的,你只有选择了 value 为 0 的项才会执行 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:31 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 我试了 不行 再说在value 为 0的时候也不符合业务要求 业务要求是只要drop的索引改变就马上触发 drop_Selected事件 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:35 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { drop.SelectedIndexChanged += new EventHandler(drop_Selected); } } 需求这么确定,为什么不把 Response.Write("<script>alert('1')</script>"); 写到 ddl_SelectedIndexChanged 事件中呢 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:37 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 还有个问题 好像这个 drop 用DropDownList drop = (DropDownList)FindControl("drop");找不到 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:39 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 没有当然找不到咯 DropDownList drop = (DropDownList)FindControl("ddl") 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:43 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 是能弹出“1”了 但是你可能没有看清我的问题 我是要程序生成的这个下拉框改变的时候弹出“1”,并不是aspx上的那个下拉框值改变的时候弹出“1” 也就是说不能在IsPostBack里面给aspx上的那个控件加事件 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:49 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 可能是你对自己的业务还不清楚,描述矛盾,自己再多想想多试试 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:53 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 我觉得我说的还是很明白了 drop那个下拉框是程序生成的 ddl那个是前台拖上去的 当ddl值改变为某一个的时候就生成drop 让后当drop的值改变的时候就触发 drop_Selected事件 然后再在 drop_Selected事件里根据drop的选择值做不同的操作 I Belong To Jesus... quinta-feira, 14 de maio de 2009 02:57 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 后台添加的控件,在Postback后会消失,需要在PostBack中重新创建 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 02:59 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 要不然,你就把 drop 拖到界面上,通过 visible 来控制显示隐藏 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 03:00 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 请问一下 我后台添加的控件 要想在PostBack里面写事件 该如何找到这个控件? I Belong To Jesus... quinta-feira, 14 de maio de 2009 03:02 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 你可以了解一下 Asp.net 的 回发机制 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 03:05 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 先谢谢 X.X.Y 我再去看看 I Belong To Jesus... quinta-feira, 14 de maio de 2009 03:11 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 再了解一下页面的生命周期, 另外如果想不刷新,可以关注一个Ajax, WebCast 上有视频和代码示码示例 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 03:12 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 还是没有弄明白 I Belong To Jesus... quinta-feira, 14 de maio de 2009 06:11 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 1 Entrar para Votar 你好,下面是刚写的一段示例,你看看, 这样的方式现在已经很少用了,一般都用 Ajax // HTML //-------------------------------------------------------------------------------------------------------- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200905141009.aspx.cs" Inherits="DropDown_X200905141009" %> <!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> <table style="width:300px;"> <tr> <td> <asp:DropDownList ID="fList1" runat="server" AutoPostBack="True" onselectedindexchanged="fList1_SelectedIndexChanged"> <asp:ListItem>0</asp:ListItem> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> </td> <td id="fTdContainer" runat="server"> </td> </tr> </table> </div> </form> </body> </html> // CS //-------------------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class DropDown_X200905141009 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { if (ViewState["IsBuild"] != null && (bool)ViewState["IsBuild"]) { // 回发生 fList2 会消失,在这里重新添加 fList2 this.BuildList(); } } } protected void fList1_SelectedIndexChanged(object sender, EventArgs e) { ViewState["IsBuild"] = true; this.BuildList(); } private void BuildList() { DropDownList fList2 = new DropDownList(); fList2.EnableViewState = true; fList2.ID = "fList2"; fList2.Items.Add(new ListItem("0", "0")); fList2.Items.Add(new ListItem("1", "1")); fList2.Items.Add(new ListItem("2", "2")); fList2.AutoPostBack = true; this.fTdContainer.Controls.Add(fList2); fList2.SelectedIndexChanged += new EventHandler(fList2_SelectedIndexChanged); } protected void fList2_SelectedIndexChanged(object sender, EventArgs e) { // 如果没有在回发时重建 fList2 FindControl 方法将找不到 fList2 DropDownList fList2 = (DropDownList)this.FindControl("fList2"); Response.Write(string.Format("<script>alert('{0}')</script>", fList2.SelectedValue)); } } 知识改变命运,奋斗成就人生! Marcado como Resposta 米兰卡卡 sábado, 16 de maio de 2009 07:54 quinta-feira, 14 de maio de 2009 06:37 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 我点了一次fList1的1 然后再点fList1的2 最后又点了一个fList1的1 就报错了 找到多个具有相同 ID“fList2”的控件。FindControl 要求控件具有唯一的 ID。 并且这个控件的ID是肯定需要的 I Belong To Jesus... quinta-feira, 14 de maio de 2009 06:59 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar protected void fList1_SelectedIndexChanged(object sender, EventArgs e) { if (ViewState["IsBuild"] == null || !(bool)ViewState["IsBuild"]) { ViewState["IsBuild"] = true; this.BuildList(); } } 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 07:04 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Pontos Moderador Question Entrar para Votar 0 Entrar para Votar 感觉这种方式确实逻辑有点乱 并且我这个里面还有其他逻辑 请问一下如果用AJAX该怎么做? I Belong To Jesus... quinta-feira, 14 de maio de 2009 07:58 Responder | Citação Avatar de 米兰卡卡 米兰卡卡0 Pontos Question Entrar para Votar 0 Entrar para Votar 你到 WebCast 里去下关于 Ajax 的课程 知识改变命运,奋斗成就人生! quinta-feira, 14 de maio de 2009 07:59 Responder | Citação Avatar de 肖小勇 肖小勇分布式系统开发与设计38,920 Ponto

浙公网安备 33010602011771号