关于DropDownList的一个有趣的Bug~

假设有如下简单代码
None.gif private   void  Page_Load( object  sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if(!IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.LoadRuleType();
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  LoadRuleType()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            ListItem li 
= new ListItem("AAAA","A");
InBlock.gif            
this.drpRuleType.Items.Add(li);
InBlock.gif
InBlock.gif            li 
= new ListItem("BBBB","B");
InBlock.gif            
this.drpRuleType.Items.Add(li);
InBlock.gif
InBlock.gif            li 
= new ListItem("CCCC","C");
InBlock.gif            
this.drpRuleType.Items.Add(li);
InBlock.gif
InBlock.gif            li 
= new ListItem("DDDD","D");
InBlock.gif            
this.drpRuleType.Items.Add(li);
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  btnShowValue_Click( object  sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
this.drpRuleType.SelectedIndex = -1;
                int i = this.drpRuleType.SelectedIndex;
InBlock.gif            
this.drpRuleType.Items.FindByValue(this.txtValue.Text.Trim()).Selected = true;
ExpandedBlockEnd.gif        }


把它放到一个简单web页面中直接运行是没有任何问题的,但如果是在调试状态,你会发现一个比较有趣的bug,把断点设置到this.drpRuleType.Items.FindByValue(this.txtValue.Text.Trim()).Selected = true;当程序运行到这里时将鼠标移到上一行代码上查看一下this.drpRuleType.SelectedIndex,发现此时的值是0(不是设置为-1了吗,好像不管用哦72_72.gif),继续向下运行,著名的黄页出现了sad_smile.gif,错误为:“DropDownList 不能有多个项被选定。”什么原因呢?

经过认真地调试及.NET源码的帮助,发现了这个问题,请看DropDownList的SelectedIndex属性源码实现:

None.gif public   override   int  SelectedIndex
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      
get
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
int num1 = base.SelectedIndex;
InBlock.gif            
if ((num1 < 0&& (this.Items.Count > 0))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                  
this.Items[0].Selected = true;
InBlock.gif                  num1 
= 0;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return num1;
ExpandedSubBlockEnd.gif      }

InBlock.gif      
set
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
base.SelectedIndex = value;
ExpandedSubBlockEnd.gif      }

ExpandedBlockEnd.gif}


看到了吧,在取SelectedIndex时自动进行了判断,只要有数据那么Selected的值就肯定大于等于0,所以我们在查看时发现设置成-1是无效的,它会自动改为0,另外它还做了另外一部操作this.Items[0].Selected = true;这个也就是直接导致Exception产生的原因(我只是想看看SelectedIndex它就把Item[0]的Selected值给改了...),所以大家在调试代码时就千万要小心了(不该看的东西就表看,否则后果很严重D~wink_smile.gif)

注:我们暂且先不谈这句代码的必要性this.drpRuleType.SelectedIndex = -1;只是为了说明的需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值