none
动态添加SelectedIndexChanged事件 RRS feed

  • 问题

  • <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...
    2009年5月14日 2:03

答案

  • 你好,下面是刚写的一段示例,你看看, 这样的方式现在已经很少用了,一般都用 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));
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    2009年5月14日 6:37
    版主

全部回复

  • 你好,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>");
            }

    知识改变命运,奋斗成就人生!
    2009年5月14日 2:17
    版主
  • 好像还是没有执行
    I Belong To Jesus...
    2009年5月14日 2:28
  • 是可以的,你只有选择了 value 为 0 的项才会执行
    知识改变命运,奋斗成就人生!
    2009年5月14日 2:31
    版主
  • 我试了 不行
    再说在value 为 0的时候也不符合业务要求
    业务要求是只要drop的索引改变就马上触发
    drop_Selected事件

    I Belong To Jesus...
    2009年5月14日 2:35
  • protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                   drop.SelectedIndexChanged += new EventHandler(drop_Selected);
    } }

    需求这么确定,为什么不把 Response.Write("<script>alert('1')</script>"); 写到 ddl_SelectedIndexChanged 事件中呢

    知识改变命运,奋斗成就人生!
    2009年5月14日 2:37
    版主
  • 还有个问题 好像这个
    drop
    用DropDownList drop = (DropDownList)FindControl("drop");找不到

    I Belong To Jesus...
    2009年5月14日 2:39
  • 没有当然找不到咯
    DropDownList drop = (DropDownList)FindControl("ddl")


    知识改变命运,奋斗成就人生!
    2009年5月14日 2:43
    版主
  • 是能弹出“1”了
    但是你可能没有看清我的问题
    我是要程序生成的这个下拉框改变的时候弹出“1”,并不是aspx上的那个下拉框值改变的时候弹出“1”
    也就是说不能在IsPostBack里面给aspx上的那个控件加事件

    I Belong To Jesus...
    2009年5月14日 2:49
  • 可能是你对自己的业务还不清楚,描述矛盾,自己再多想想多试试
    知识改变命运,奋斗成就人生!
    2009年5月14日 2:53
    版主
  • 我觉得我说的还是很明白了
    drop那个下拉框是程序生成的 ddl那个是前台拖上去的
    当ddl值改变为某一个的时候就生成drop
    让后当drop的值改变的时候就触发
    drop_Selected事件
    然后再在
    drop_Selected事件里根据drop的选择值做不同的操作

    I Belong To Jesus...
    2009年5月14日 2:57
  • 后台添加的控件,在Postback后会消失,需要在PostBack中重新创建
    知识改变命运,奋斗成就人生!
    2009年5月14日 2:59
    版主
  • 要不然,你就把 drop 拖到界面上,通过 visible 来控制显示隐藏
    知识改变命运,奋斗成就人生!
    2009年5月14日 3:00
    版主
  • 请问一下 我后台添加的控件 要想在PostBack里面写事件
    该如何找到这个控件?
    I Belong To Jesus...
    2009年5月14日 3:02
  • 你可以了解一下 Asp.net 的 回发机制
    知识改变命运,奋斗成就人生!
    2009年5月14日 3:05
    版主
  • 先谢谢 X.X.Y
    我再去看看
    I Belong To Jesus...
    2009年5月14日 3:11
  • 再了解一下页面的生命周期, 另外如果想不刷新,可以关注一个Ajax, WebCast 上有视频和代码示码示例
    知识改变命运,奋斗成就人生!
    2009年5月14日 3:12
    版主
  • 还是没有弄明白
    I Belong To Jesus...
    2009年5月14日 6:11
  • 你好,下面是刚写的一段示例,你看看, 这样的方式现在已经很少用了,一般都用 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));
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    2009年5月14日 6:37
    版主
  • 我点了一次fList1的1 然后再点fList1的2 最后又点了一个fList1的1
    就报错了

    找到多个具有相同 ID“fList2”的控件。FindControl 要求控件具有唯一的 ID。

    并且这个控件的ID是肯定需要的
    I Belong To Jesus...
    2009年5月14日 6:59
  • protected void fList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ViewState["IsBuild"] == null || !(bool)ViewState["IsBuild"])
        {
            ViewState["IsBuild"] = true;
            this.BuildList();
        }
    }

    知识改变命运,奋斗成就人生!
    2009年5月14日 7:04
    版主
  • 感觉这种方式确实逻辑有点乱 并且我这个里面还有其他逻辑

    请问一下如果用AJAX该怎么做?
    I Belong To Jesus...
    2009年5月14日 7:58
  • 你到 WebCast 里去下关于 Ajax 的课程
    知识改变命运,奋斗成就人生!
    2009年5月14日 7:59
    版主