jlzhou

回复才有动力~~
posts - 24, comments - 148, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

关于ASP.NET控件DropDownList控件的问题

Posted on 2005-04-28 16:39 jlzhou 阅读(9832) 评论(13)  编辑 收藏 所属分类: 编程技术区
大家都知道DropDownList的两个重要的属性吧:

SelectedIndex
SelectedValue

通常我们在页面的postback时,读取这两个属性,对用户的选择做出处理。

ASP.NET封装了这两个属性,但是我发现了一个问题:就是在有的时候,SelectedIndex不能返回我们期待的结果!

DropDownList的Items包括ListItem对象,ListItem有Value和Text两个属性,很多时候两者是不同的,

例如,某个DropDownList包含以下选项:

Value Text
0 苹果
1 鸭梨
2 香蕉
3 草莓
4 柑橘
0 葡萄
1 木瓜

当用户选择苹果时,在Postback时,SelectedValue的值是:0,SelectedIndex的值是:0
当用户选择葡萄时,在Postback时,SelectedValue的值是:0,SelectedIndex的值是:还是0!而不是5!

我不知道这是不是算作bug,可能是ASP.NET通过SelectedValue的值来“计算”出SelectedIndex的值,而不是DropDownList真正选中的值。

所以,尽量避免在DropDownList包括相同Value的项,小心处理,避免出错。

Feedback

#1楼    回复  引用    

2005-04-28 16:48 by bestcomy [未注册用户]
不是bug, 反编译可知:
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
{
string[] textArray1 = postCollection.GetValues(postDataKey);
if (textArray1 != null)
{
int num1 = this.Items.FindByValueInternal(textArray1[0]);
if (this.SelectedIndex != num1)
{
this.SelectedIndex = num1;
return true;
}
}
return false;
}

看看所调用的这个方法就知道
this.Items.FindByValueInternal(textArray1[0]);
是通过值来确定被选择项的

问题的关键在于: form 以Name/Value的形式提交,而select 在提交的时候的Value值就是被选择的option的value属性。

#2楼    回复  引用  查看    

2005-04-28 16:57 by oupatch的C#专栏      
这个特点在asp时代就有的.

#3楼    回复  引用  查看    

2005-04-28 17:23 by 再见理想      
不光是DropDownList,listBox也有这个问题。

#4楼    回复  引用  查看    

2005-04-28 19:28 by 二十四画生      
不同的Text,相同的value这种情况到是少见。不过你说的问题倒是值得注意。

#5楼    回复  引用    

2005-04-29 10:57 by skywood [未注册用户]
这个问题我也想过,好像微软没怎么考虑清楚,其实在dropdownlist中,反而是Value可能相同,而Text不会相同,所以应该是根据text来获得selectedindex,这并不是办不到的事情。
这可能不是一个bug,但确是设计的缺陷

#6楼    回复  引用    

2005-04-30 14:32 by simonfoe [未注册用户]
private void drpObject_SelectedIndexChanged(object sender, System.EventArgs e)
{
DropDownList drp = (DropDownList)sender;
int i = 0;
i = drp.SelectedIndex;
//看一下 i 的值是多少。应该可以。
}
还有一般还可以用 Request.Form["drpObject"];取得SelectedValue.

(一点拙见)

#7楼    回复  引用  查看    

2005-05-09 12:36 by 听棠.NET      
Key值不能相同啊。一相同就不行了。

#8楼    回复  引用  查看    

2005-06-15 16:27 by Teddy's Knowledge Base      
这不属于bug。
一般value值就像id一样是不应该重复的,否则会有很多奇怪的问题发生,asp.net的事件机制回调时的sender参数,很多时候也会根据id,value等这些属性来确定触发者,如果值重复,则很可能会发生各种混乱,所以在web开发时,这样的错误一定要避免!

#9楼    回复  引用    

2005-11-09 11:35 by bamboopot [未注册用户]
value值重复是经常发生的事,有没有解决的方法。。。

#10楼    回复  引用    

2005-11-28 18:37 by 阿賴耶識 [未注册用户]
也许我们可以用变通的方法来实现,比如我们用一7的倍数来表示同一VALUE的值,最后作判断,如果可以整除就认为它是同一VALUE,一点拙见~~~

#11楼    回复  引用  查看    

2006-04-04 16:13 by 小新0574      
我也遇到了这个问题,刚开始觉得很奇怪

#12楼    回复  引用    

2006-06-21 16:08 by jin.t [未注册用户]
下面是我以前在CSDN发的一篇关于DropDownList的文章.请指正啊.
==========================


在ASP.Net里,如果你的DropDownList控件是在运行时候动态从数据库里取数据然后
Items.Add进去的,那么当你选择一个项后状态根本不能保存下来,而且也取不到你的
选择值,这个咋个整啊?为何不用JavaScript试试呢.于是就试成了,拿出来给遇到同样
问题的弟兄.希望有所帮助.举个取值的例子:

(1)先在WebForm里放一个DropDownList1,一个TextBox1.然后我们要实现的是在DropDownList1选择
后,在TextBox里把值显示出来;(注意这里DropDownList里的Items项是在PageLoad时候动态添加进去的
数据库字段)

(2) 在PageLoad里代码如下意思(代码不完整,表示个意思):

:
:
While Reader_DBFields.Read()
DropDownList1.Items.Add(Trim(Reader_DBFields.GetString(0)))
End While
:
:

(2)把WebForm切换到HTM代码模式,然后添加JavaScript如下:
<script language="JavaScript">
function onDropSel()
{
document.getElementById("TextBox1").value = document.getElementById("DropDownList1").value;
return ;
}
</Script>
:
:
(3)找到定义DropDownList那段代码,加入OnChange事件,代码为:OnChange="javascript:onDropSel()"
<asp:dropdownlist id="DropDownList1" style="Z-INDEX: 121; LEFT: 515px; POSITION: absolute; TOP: 196px" runat="server" Height="24px" Width="196px" Font-Size="Smaller" OnChange="javascript:onDWsel();"></asp:dropdownlist>


然后运行,选择DropDownList的项,看到在TextBox里显示出你的选择值就OK了.




如需探讨可Mail: kylixsales@163.com

#13楼    回复  引用    

2008-01-02 11:52 by xkena77 [未注册用户]
关于12楼说的,动态添加item的DropDownList取不到选择值,我也碰到了,但琢磨了一阵子,明白了是什么问题。
动态添加item的代码,必须用IsPostBack了判断是否执行,否则每次某个事件提交后,添加 item的代码段会再次执行,然后selectedindex又会被置到0了。
修改后,添加了IsPostBack的判断,就能取出选择值了。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: