今天遇到:不能在DropDownList中选择多个项。并由此做了分析。欢迎指正

今天遇到一个问题:不能在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对象上的。
由此发生了上述的事件。哈哈,编程蛮有意思的。
(开源中国的排版这么难用啊)

猜你喜欢

转载自my.oschina.net/u/2551141/blog/652655