今天遇到:不能在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對象上的。
由此發生了上述的事件。哈哈,編程蠻有意思的。
(開源中國的排版這麼難用啊)
相關文章
相關標籤/搜索