代码之家  ›  专栏  ›  技术社区  ›  Serkan Hekimoglu

动态添加的列表框的事件处理程序未在ASP.NET上激发

  •  -1
  • Serkan Hekimoglu  · 技术社区  · 14 年前

    首先,如果我的问题可能重复,我很抱歉,但我搜索太多,找不到解决方案。场景是我有一个用户控件。如果给定列表的计数为0,则此用户控件将动态创建列表框。控件是动态添加的,添加它们没有问题,但事件处理程序没有添加。如果我在第一个列表框中选择一个项目,第二个列表框将动态添加,项目也将动态添加。第一个列表框出现,但SelectedIndexChanged事件处理程序不起作用。我的代码有什么问题?

    编辑: 我试图添加

    li.Attributes.Add("onselectedindexchanged","selectedIndexChanged");
    

    li.AutoPostBack = true;
    

    但仍然没有开火…

    private List<string> myList = new List<string>() { "Serkan", "Kadir" };
        private List<string> mySecondList = new List<string>() { "Istanbul", "Ankara" };
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (myList.Count > 0)
                {
                    ListBox li = new ListBox();
                    li.ID = Guid.NewGuid().ToString();
                    li.SelectedIndexChanged += new EventHandler(this.selectedIndexChanged);
                    foreach (string item in myList)
                    {
                        li.Items.Add(item);
                    }
    
                    this.Controls.Add(li);
                }
            }
        }
    
        private void selectedIndexChanged(object sender, EventArgs e)
        {
            ListBox li2 = new ListBox();
            li2.ID = Guid.NewGuid().ToString();
    
            foreach (string item in mySecondList)
            {
                li2.Items.Add(item);
            }
            this.Controls.Add(li2);
        }
    
    4 回复  |  直到 14 年前
        1
  •  0
  •   RichardW1001    14 年前
    li.Attributes.Add("onselectedindexchanged","selectedIndexChanged"); 
    

    添加客户端HTML属性。这里显示的selectedIndexChanged方法是服务器端方法。您要么需要向控件添加一个自动回发,要么向控件添加一个服务器端事件处理程序,使其调用服务器上的C函数,要么创建一个客户端javascript函数来处理客户端事件。

    编辑---

    当页面发布回服务器时,控件将不再存在。该页是一个新的Istance,尚未将列表框添加到其控件集合中。当auto postback为true时,正在调用事件,但服务器的页面对象中不存在该控件,并且如果删除if page.ispostback块,则会重新创建该控件,因此该控件不是引发事件的控件,并且该控件仍然不存在。

    这个控件的实际目标是什么?它只是提供一个主细节的东西吗?

    编辑2——

    为您创建了有效的解决方案:

    Page:

    <asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true" Visible="false" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"></asp:ListBox>
    <br />
    <asp:ListBox ID="ListBox2" runat="server" Visible="false"></asp:ListBox>
    

    Codebehind:

    private List<string> myList = new List<string> {
        "Serkan",
        "Kadir"
    };
    private List<string> mySecondList = new List<string> {
        "Istanbul",
        "Ankara"
    
    };
    protected void Page_Load(object sender, System.EventArgs e)
    {
        if (!Page.IsPostBack) {
            if (myList.Count > 0) {
                ListBox1.DataSource = myList;
                ListBox1.DataBind();
                ListBox1.Visible = true;
            }
        }
    }
    
    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListBox2.DataSource = mySecondList;
        ListBox2.DataBind();
    
        ListBox2.Visible = true;
    }
    
        2
  •  0
  •   Ali Tarhini    14 年前

    1-动态添加控件必须加载到页面初始化事件而不是页面加载中 2个选中的列表框不适用于.attributes.add(“selectedIndexChanged”,“…”),因为该复选框列表是一个ASP.NET控件,但它以HTML格式呈现为常规输入

        3
  •  0
  •   RichardW1001    14 年前

    事件没有发生的原因是您误解了ASP.NET页的生命周期。当您请求页面时,ASP.NET将创建相应页面类的新实例。此实例不知道以前创建的任何其他实例。它使用page类的实例生成一组HTML,并将其作为响应发送回浏览器。然后,服务器上的page类实例及其状态将被销毁。

    当页面回发时,ASP.NET使用VIEWSTATE、IDS等读取并将回发的HTML元素映射到新创建的页面实例中的服务器控件。您添加到上一个实例的控件集合中的元素在此新实例中不存在,因此ASP.NET无法识别它们,或在它们上激发事件。

    这是一篇文章,它演示了我认为您正在尝试实现的那种事情,尽管使用了GridView,但它使用了与我之前发布的解决方案类似的方法。

    http://www.codeproject.com/KB/aspnet/MultiNestMDGridview.aspx

    也许你可以准确地解释最终目标是什么,因为可能有更好的解决方案?我完全接受我之前发布的方法和该链接中的解决方案的局限性,即可用的详细程度有限,这可能是问题,也可能不是问题,具体取决于您实际尝试做什么。

    编辑——

    如果按照@microgen的建议更改为page_init事件,请删除if(!page.ispostback),将autopostback设置为true,并为动态添加的控件使用非易失性ID,这将调用服务器端事件并呈现第二个列表框。它不能与guid.new()一起工作,因为新创建的页面上的控件集合不会包含任何具有匹配ID的内容,因此事件处理程序不会被挂接。这将回答最初发布的问题。但是,第二个列表框不会触发事件,除非您创建它并将其添加到page.controls中,page_in it中的控件的方式与第三个列表框中的控件相同,依此类推,所有这些都是基于上述原因。

        4
  •  0
  •   Serkan Hekimoglu    14 年前

    伙计们,我的代码工作得很好。我今天刚在Diff Visual Studio中尝试过,一切都很好。@RichardW1001和@Microgen感谢您的关注和帖子。