+ -
当前位置:首页 → 问答吧 → 动态生成DropDownList的问题.

动态生成DropDownList的问题.

时间:2011-12-06

来源:互联网

页面上有一个按钮 bnt
点击后动态生成一个DropDownList
C# code

DropDownList ddl = new DropDownList();
ddl.ID = "d1";
ddl.AutoPostBack = true;
ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
ddl.Items.Add(new ListItem("a","1"));
ddl.Items.Add(new ListItem("b","2"));
 Panel1.Controls.Add(ddl)


ddl_SelectedIndexChanged事件
  C# code

 protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
Response.Write(ddl.SelectedValue);
        }



现在问题是:选中后(比如先ddl的b选项),事件没反应.哪里错了?

作者: jasonliangbiz   发布时间: 2011-12-06

改变下事件触发代码的位置

DropDownList ddl = new DropDownList(); 
ddl.ID = "d1"; 
ddl.Items.Add(new ListItem("a","1")); 
ddl.Items.Add(new ListItem("b","2")); 
ddl.AutoPostBack = true;
ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
Panel1.Controls.Add(ddl)

作者: taomanman   发布时间: 2011-12-06

引用 1 楼 taomanman 的回复:
改变下事件触发代码的位置

DropDownList ddl = new DropDownList();
ddl.ID = "d1";
ddl.Items.Add(new ListItem("a","1"));
ddl.Items.Add(new ListItem("b","2"));
ddl.AutoPostBack = true;
ddl.SelectedIndexCha……

试试吧

作者: qydvip   发布时间: 2011-12-06

还是不行.难道我见鬼了?

作者: jasonliangbiz   发布时间: 2011-12-06

引用 1 楼 taomanman 的回复:
改变下事件触发代码的位置

DropDownList ddl = new DropDownList();
ddl.ID = "d1";
ddl.Items.Add(new ListItem("a","1"));
ddl.Items.Add(new ListItem("b","2"));
ddl.AutoPostBack = true;
ddl.SelectedIndexCha……

设了断点.选中后根本就没运行到ddl_SelectedIndexChanged
怎么回来啊?晕了.

作者: jasonliangbiz   发布时间: 2011-12-06

你重新生成解决方案,然后就是你可用SelectedIndexChanging事件试一下;如果是动态生成的dropdownlist应该用委托

作者: wangxingwu0   发布时间: 2011-12-06

下面索引改变,就会弹出测试,索引改变,会刷新整个页面,所以Page_Load里面还得重新绑定,如下
C# code
      protected void Page_Load(object sender, EventArgs e)
        {

                DropDownList ddl = new DropDownList();
                ddl.ID = "d1";
                ddl.AutoPostBack = true;
                ddl.SelectedIndexChanged += (s, j) => { this.RegisterStartupScript("awoke", "<script>alert('测试');</script>"); };
                ddl.Items.Add(new ListItem("a", "1"));
                ddl.Items.Add(new ListItem("b", "2"));
                Panel1.Controls.Add(ddl);


        }

作者: Return_false   发布时间: 2011-12-06

还真是你说的那样.直接刷新页面了.

关键我现在不能在Page_Load里写.直接在按钮点击事情下写的.

如何写?

引用 6 楼 return_false 的回复:
下面索引改变,就会弹出测试,索引改变,会刷新整个页面,所以Page_Load里面还得重新绑定,如下
C# code
protected void Page_Load(object sender, EventArgs e)
{

DropDownList ddl = new DropDownList();
……

作者: jasonliangbiz   发布时间: 2011-12-06

DropDownList 有个属性AutoPostBack设置了没?

作者: zws0406   发布时间: 2011-12-06

引用 8 楼 zws0406 的回复:
DropDownList 有个属性AutoPostBack设置了没?

已经设置了的.

  ddl.AutoPostBack = true;

作者: jasonliangbiz   发布时间: 2011-12-06

完全可以利用JS来控制,防止页面刷新,尽量避免动态创建服务器控件

作者: Return_false   发布时间: 2011-12-06

ddl.AutoPostBack = true;
估计页面刷新未获取到事件吧···

作者: zws0406   发布时间: 2011-12-06

在页面回传的时候判定DDL的值。就!ispostback的外面,、。要不就用AJAX写

作者: jianghui7897   发布时间: 2011-12-06

在页面回传的时候绑定DDL的值 打错了,至于是不是按钮在点击,你完全可以做一个全局变量,按钮点击的时候改变改变量的值,在回传里判断该变量的值就可以了

作者: jianghui7897   发布时间: 2011-12-06

引用 13 楼 jianghui7897 的回复:
在页面回传的时候绑定DDL的值 打错了,至于是不是按钮在点击,你完全可以做一个全局变量,按钮点击的时候改变改变量的值,在回传里判断该变量的值就可以了

这样一来的话原先生成的ddl就在页面里消失了.我需要ddl选中后,还在页面内.

作者: jasonliangbiz   发布时间: 2011-12-06

你要明白一点,页面一旦刷新,整个页面控件都要开始重绘,也就是说原先固定在页面上的慢慢的开始解析,然而你动态添加的,是不会重绘的,只不过是临时的局部变量,除非你在重写页面的重绘事件

本来一个简单的问题,非要搞那么复杂,至少我觉得当你觉得很难实现时或者非常复杂时,只能说明,你选错了方向,设计有问题或者需求不合理

作者: Return_false   发布时间: 2011-12-06