今天遇到一个问题:不能在DropDownList中选择多个项。 错误代码以下: public void bindCity() { BLL.LineCity lcbll = new BLL.LineCity(); List<Model.LineCity> lclist = lcbll.GetModelList("1=1 order by Id desc"); foreach (Model.LineCity i in lclist) { ListItem l = new ListItem(i.CnName, Convert.ToString(i.Id)); startCityo.Items.Add(l); endCityo.Items.Add(l); } } 初步错误分析:同一数据源i被同时绑定到了startCityo和endCityo上。当我选择startCityo 时并不会出行上述错误。可是选择endCityo时便会出现报错。 改正后的代码: public void bindCity() { BLL.LineCity lcbll = new BLL.LineCity(); List<Model.LineCity> lclist = lcbll.GetModelList("1=1 order by Id desc"); foreach (Model.LineCity i in lclist) { ListItem l = new ListItem(i.CnName, Convert.ToString(i.Id)); startCityo.Items.Add(l); } foreach (Model.LineCity i in lclist) { ListItem l = new ListItem(i.CnName, Convert.ToString(i.Id)); endCityo.Items.Add(l); } } 此时可以达到咱们预期的效果,并且不会报错。 二者对比以后,我发现,原先的分析是错误的。在错误代码中, ListItem对象 l 被绑定到了两个控件上,即同一个对象被绑定到了两个DropDownList控件上。 而改正后的代码,两个DropDownList控件绑定的虽然是同一个数据源, 可是ListItem对象倒是不一样的,因此未出现报错。 由此得出结论:同一个ListItem对象不可以绑定到不一样的DropDownList控件上。 DropDownList控件上绑定的ListItem对象是对象的地址。 彷佛咱们已经分析出来了问题的缘由,但真的是这样吗。如下是我引用自另外一处的代码: public void bindCity() { BLL.LineCity lcbll = new BLL.LineCity(); List<Model.LineCity> lclist = lcbll.GetModelList("1=1 order by Id desc"); foreach (Model.LineCity i in lclist) { ListItem l = new ListItem( i.CnName,Convert.ToString(i.Id)); lblgocity.Items.Add(l); lbltocity.Items.Add(l); DropDownList2.Items.Add(l); DropDownList3.Items.Add(l); DropDownList5.Items.Add(l); } } 这是另外一个web页的部分代码。在该页上并未出现有关于不能在DropDownList中选择多个项的错误。 由此产生了进一步分析: 我发如今错误代码页中有 startCityo.SelectedValue = stCity; endCityo.SelectedValue = enCity; 的代码。其在pageload中。 而在另外一个web页中也有部分相似代码: lblgocity.SelectedValue = model.StarCity; lbltocity.SelectedValue = model.EndCity; 同时其也存在于pageload中。 分析陷入了僵局。 因而便开始分析DropDownList控件。这是一个对象,且他只能选择一个项。 由此彷佛出现点头绪了,咱们知道,pageload事件引起的条件包括asp:Linkbutton。 并且,出现报错的场景,并非发生在选择控件项的时候,而是发生在点击asp:Linkbutton按钮的时候。 而pageload中 又存在 startCityo.SelectedValue = stCity; endCityo.SelectedValue = enCity;代码。 因此,判定该代码执行了两次,因此引起报错。 而在另外一个web页面虽然也存在有相似代码,可是其内有限定条件。 总共就只执行一次。问题开始有了眉目。 经过查阅手册,发现SelectedValue只读不写。什么状况,为啥写了也没问题呢。 固然不经过这次问题,我还真不知道,入门尚浅,阿门。 不过问题最终仍是现出原形,由于个人linkbutton的click事件中有: Response.Redirect(url)的调用,其内传有stcity,encity的值。 又因为startCityo与endCityo包含的是同一个ListItem对象。 设置startCityo或endCityo中任何一个的SelectValue都会反映到另外一个上面 且因为一开始stCity和enCity都是空字符串。当Response.Redirect后, 传入的SelectValue与原有空字符串不一样时,便会产生错误。 至关于写了两个不一样的SelectValue。 以上,即是个人总结。 可是为何正确代码就行的通呢。这里,我认为,startCityo与endCityo是两个不一样的对象。 一般状况下,咱们只设置endCityo的selectvalue时, 会把当前的selectvalue属性是true的设置成false, 从而不会出现上述报错可是这种内置的转换应该是绑定在DropDownlist对象上的。 由此发生了上述的事件。哈哈,编程蛮有意思的。 (开源中国的排版这么难用啊)