今天遇到一個問題:不能在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對象上的。 由此發生了上述的事件。哈哈,編程蠻有意思的。 (開源中國的排版這麼難用啊)