首页 新闻 会员 周边

关于DropDownList动态加载数据后选择的值不正确的诡异问题

0
悬赏园豆:5 [已关闭问题]

1.问题描述
表数据如下(一个xlbm对应多个clbm):
clbm  xlbm
001   111
002   111
003   111
101   222
102   222
501   555
506   555
508   555
509   555
动态加载数据到DropDownList代码如下:

string sql = "select clbm,xlbm from [tXlCl] order by clbm";
SqlDataReader sdr
= myFun.Datareader(sql);
while (sdr.Read())
{
   
//显示用clbm,选项的值为xlbm
    this.ddlData.Items.Add(sdr["clbm"].ToString(),sdr["xlbm"].ToString());
}
sdr.Close();

 这样加载完下拉列表数据没有问题

2.当我调用其select方法的时候代码如下:

protected void ddlData_SelectedIndexChanged(object sender, EventArgs e)
{
this.txtClBm.Text = this.ddlClbm.SelectedItem.Text;
this.txtXlBm.Text = this.ddlClbm.SelectedValue;
}

 
3.假如现在选择001,等一下this.txtClBm.Text显示为(001)和this.txtXlBm.Text显示为(111)--正常
但是当我选择003或者002之后,this.txtClBm.Text显示为(001)和this.txtXlBm.Text显示为(111)--错误
然后再选择501,this.txtClBm.Text显示为(501)和this.txtXlBm.Text显示为(555)--正常
但是当我选择506之后,this.txtClBm.Text显示为(501)和this.txtXlBm.Text显示为(555)--错误
再选择102之后,this.txtClBm.Text显示为(101)和this.txtXlBm.Text显示为(222)--错误

也就是说我无论选择002或者003其this.txtClBm.Text始终显示001;无论选择506或509,this.txtClBm.Text始终显示501
但实际上选择不同xlbm对应的clbm,this.txtXlBm.Text却能正常改变

4.结论:只要是value相同的item,无论选择哪一个,结果this.ddlClbm.SelectedItem.Text始终都是这组相同value的item的第一个项
我调试过查看其index也始终都是该组的第一个.

问题:为什么会这样?有办法解决吗?
ps:假如xlbm和clbm是一对一的关系就不会出现这个问题

与卡的主页 与卡 | 初学一级 | 园豆:58
提问于:2010-02-26 11:21
< >
分享
其他回答(6)
0

this.ddlData.Items.Add(sdr["clbm"].ToString(),sdr["xlbm"].ToString());

这句不行吧,add方法根本就没有带两个参数的

Ou lei | 园豆:619 (小虾三级) | 2010-02-26 11:39
0

就是啊,你用的哪一个版本的VS哟?

估计是早期的版本,而且Key和Value搞反了。

自由飞 | 园豆:174 (初学一级) | 2010-02-26 12:23
0

试试这个:

string sql = "select clbm,xlbm from [tXlCl] order by clbm";
SqlDataReader sdr
= myFun.Datareader(sql);

ListItem list;
while (sdr.Read())
{
   
//显示用clbm,选项的值为xlbm

    list = new ListItem("Text", "Value");
    this.ddlData.Items.Add(list);
}
sdr.Close();

第二海 | 园豆:205 (菜鸟二级) | 2010-02-26 13:34
关于第四个问题,只要把循环代码放到 if (!Page.IsPostBack) { } 这个代码块中!~~ 可以不用循环 直接用DropDownList控件的数据绑定就行!
支持(0) 反对(0) 第二海 | 园豆:205 (菜鸟二级) | 2010-02-26 13:39
0

Page.IsPostBack

sinace | 园豆:220 (菜鸟二级) | 2010-02-26 14:57
0

4.结论:只要是value相同的item,无论选择哪一个,结果this.ddlClbm.SelectedItem.Text始终都是这组相同value的item的第一个项
我调试过查看其index也始终都是该组的第一个.

你的这个结论有问题吗?.应该是正茬功能的啊。

毕竟你的value是一样的,那你还想在三次选择操作中,一样的值都还有变化啊,value是key的作用。

邢少 | 园豆:10926 (专家六级) | 2010-02-26 15:11
0

this.ddlData.Items.Add(sdr["clbm"].ToString(),sdr["xlbm"].ToString()); 这句话有问题 你改成如下:

ListItem item = new ListItem();
item.Value = sdr["xlbm"].ToString();
item.Text =sdr["clbm"].ToString();

 this.ddlData.Items.Add(item);

问题就应该解决了?

不过这样子写还是有问题的,因为sdr["xlbm"].ToString();值有重复,因此你使用this.ddlClbm.SelectedValue选择值的时候会出现重复的几个值,此时就会出现控件取值的时候会默认的去获取最先检索到的那个index项的值,因此就会出现你这样子的错误。

DropDownList控件原本就是Html控件中的select控件,所以原理是一样的。这里可以允许Text值为重复,但是value值不可以重复.

所以这里你只能是让添加的value值唯一即可

 

 

 

 

西越泽 | 园豆:10775 (专家六级) | 2010-02-26 16:55
0

应该是你的key和value值搞反了!!

绝大部分情况下绑定dropdownlist中的key值是唯一的!

如果key不唯一,确实会出现你碰到的这个问题!

这应该是dropdownlist有意文之的。

langford | 园豆:710 (小虾三级) | 2010-02-27 00:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册