今天遇到:不能在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对象上的。
由此发生了上述的事件。哈哈,编程蛮有意思的。
(开源中国的排版这么难用啊)
相关文章
相关标签/搜索