当前位置:编程学习 > C#/ASP.NET >>

DropDownList 后台指定SelectedIndexChanged触发不了,怎么办?


 protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            ShowPage();
        }

    }
    public void ShowPage()
    {
        DropDownList ddl = new DropDownList();
        ddl.AutoPostBack = true;
        ddl.Items.Add(new ListItem("国家", "c"));
        ddl.Items.Add(new ListItem("中國", "c1"));
        ddl.Items.Add(new ListItem("美國", "c2"));
        ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
        this.Form.Controls.Add(ddl);
    }
    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dl = (DropDownList)sender;
        Response.Write("<script>alert('" + dl.SelectedValue + "')</script>");
    }

如上代码,定了个断点调试。发现  ddl_SelectedIndexChanged这个方法没有进去。。
但是假如,我把pageload事件中不写!IsPostBack的话,此方法是可以用的。

现在我的需求是做一个无限级的联动查询,卡在第一步了。如果第一步走得通,后面的就自然搞定了。大虾们,帮帮忙啦。
出一个无BUG版本的无限级联动查询。。。  暂不考虑JS,谢谢。 --------------------编程问答-------------------- DropDownList 控件是否启用回发?属性里 启用 --------------------编程问答-------------------- 楼上的大侠,,  可能是我代码写的有点烂。。
但是代码中,的确有“ddl.AutoPostBack = true;” 这句话。。。 --------------------编程问答-------------------- 1、DropDownList 控件的属性 AutoPostBack="True" 没有写;

2、DropDownList 控件的数据绑定没有放在if (!Page.IsPostBack) 里面;

3、DropDownList 控件选定项的value 值只有在发生变化时,才将信息发往服务器;  --------------------编程问答-------------------- 呵呵 正在上班回答的太仓促 没看你的代码

你是想SelectedIndexChanged改变时 调用ShowPage()方法?



   protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        ShowPage();
        DropDownList dl = (DropDownList)sender;
        Response.Write("<script>alert('" + dl.SelectedValue + "')</script>");
    }



--------------------编程问答-------------------- 第一次提交页面,页面中加入了ddl

当下拉框产生事件后,对服务器再次提交,那么ShowPage方法不会进去,所以页面也就木有ddl了

既然木有ddl怎么会进入下拉选择事件呢

至于你说的去掉ispostback,那就是页面只要提交都会产生,那么ShowPage方法能进去,能新添加ddl,所以他的下拉也就存在 --------------------编程问答-------------------- BS cs?
bs参考http://www.cnblogs.com/xugang/archive/2011/07/15/2107425.html --------------------编程问答-------------------- 唉,AutoPostBack="True"写了;(!Page.IsPostBack) 也写了;控件的value值,没有重复,。
有谁能真正的解决这个问题?感激不尽啊!!! --------------------编程问答-------------------- 5楼的说法  不可否认,但面对一个无限级联动的需求,ASP.NET 做不到么? --------------------编程问答-------------------- 前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!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>
    </div>
    </form>
</body>
</html>

--------------------编程问答-------------------- 首先你要理解为什么你在page_load里面不判断postback就可以执行,因为你的dropdownlist启用了AutoPostBack,那么你每次选中的时候就会算一次回发就会重新执行绑定当然就就不会执行你的change事件了
我这里把绑定的代码放在重写的oninit里就可以了


 protected override void OnInit(EventArgs e)
        {
            ShowPage();
        }

当然这只是我自己的理解 --------------------编程问答-------------------- 首先,你详细百度一下ispostback什么时候触发,网页首次加载。
给你段临时手写代码,你参考一下。

前台
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DropDownList ID="test" runat="server"  OnSelectedIndexChanged="Tchange" AutoPostBack="true" >
    
    </asp:DropDownList>
    </div>
    </form>
</body>
</html>


后台

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindDL();
        }
    }

    protected DataTable  getDT()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("t1");
        dt.Columns.Add("t2");
        for (int i = 0; i < 10; i++)
        {
            DataRow n = dt.NewRow();
            n["t1"] = i.ToString();
            n["t2"] = i.ToString();
            dt.Rows.Add(n);
        }
        
        dt.AcceptChanges();
        return dt;
    }
    protected void BindDL()
    {
        DataTable dt = getDT();
        test.DataSource = dt;
        test.DataTextField = "t1";
        test.DataValueField = "t2";
        test.DataBind();
    
    }
    protected void Tchange(object sender, EventArgs e)
    {
        Response.Write(test.SelectedValue.ToString());
    }
--------------------编程问答-------------------- 这个可以在前台空间里面加上onselectindexchange代码就行了,不过我的问题是我要多行的无限级联动,你的至少一个而已 --------------------编程问答-------------------- 为何你写的代码不行,而Insus.NET写的,就行呢,差异在哪?不急不急,慢慢看看Insus.NET来说明与演示一下:

本想把图片上传于此的,但是CSDN只能上传2MB(没有办法,只好帖链接了)。
另外博客园可以上传10MB,因此也是Insus.NET喜欢博客园的原因之一。

http://www.cnblogs.com/insus/p/3344850.html --------------------编程问答-------------------- 以前贴过一个例子,可以直接复制源代码运行:http://bbs.csdn.net/topics/380242537 --------------------编程问答-------------------- 实际上这个demo是我4、5年前贴出来的,后来只是copy,没有修改过。里边的bug也没有修正过。

你可以看到,dropdownlist2是具有autopostback的,而且它是动态加载内容的(因为动态所以根本不可能弄到什么Page_Init里边)。

关于你的问题,我懒得看了。我既然贴出了所有代码,方便于你可以实际去研究,那么就等你发现了差别,你能提出了更加具体的问题,再来讨论吧。 --------------------编程问答-------------------- 上面的地址错了,重新贴一下地址:http://bbs.csdn.net/topics/390228660

在第#9楼。 --------------------编程问答-------------------- 你这只有重加载才能有下拉框控件存在。。。 --------------------编程问答-------------------- 服务器控件,在页面里写的,和在后台new出来的,加事件的方式是不一样的。

因为webform是无状态的。每次提交都会“忘记”上次的设置。

你在 if (!IsPostBack) 里面设置的change事件,在下次访问的时候,就会被“忘记”。

你没有加判断的时候,才会每次都会“想起”

服务器控件级别的联动比较不好处理,很烦。 --------------------编程问答--------------------
引用 13 楼 insus 的回复:
为何你写的代码不行,而Insus.NET写的,就行呢,差异在哪?不急不急,慢慢看看Insus.NET来说明与演示一下:

本想把图片上传于此的,但是CSDN只能上传2MB(没有办法,只好帖链接了)。
另外博客园可以上传10MB,因此也是Insus.NET喜欢博客园的原因之一。

http://www.cnblogs.com/insus/p/3344850.html


引用 13 楼 insus 的回复:
为何你写的代码不行,而Insus.NET写的,就行呢,差异在哪?不急不急,慢慢看看Insus.NET来说明与演示一下:

本想把图片上传于此的,但是CSDN只能上传2MB(没有办法,只好帖链接了)。
另外博客园可以上传10MB,因此也是Insus.NET喜欢博客园的原因之一。

http://www.cnblogs.com/insus/p/3344850.html


引用 13 楼 insus 的回复:
为何你写的代码不行,而Insus.NET写的,就行呢,差异在哪?不急不急,慢慢看看Insus.NET来说明与演示一下:

本想把图片上传于此的,但是CSDN只能上传2MB(没有办法,只好帖链接了)。
另外博客园可以上传10MB,因此也是Insus.NET喜欢博客园的原因之一。

http://www.cnblogs.com/insus/p/3344850.html
+10086   我就蹭点分
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,