Rocho.J

人脑是不可靠的, 随时记录感悟并且经常重复!

 

[转]动态创建控件时, 控件事件无法触发的问题. --- 转自: 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
View Code

 

posted on 2015-12-24 03:14  RJ  阅读(214)  评论(0)    收藏  举报

导航