精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# DropDownList的一個有意思的bug及解決

開發 后端
這里將就C#.Net 環境下Web開發中經常使用的C# DropDownList控件的SelectedIndex屬性進行了詳細的探討,發現了這一屬性在使用中存在的問題,并經過測試,提出了回避和解決的辦法。
C# DropDownList控件是C#.Net 控件面板Web Form下的一個控件,通過預先設定或動態數據綁定將其填入可供用戶選擇的數據,既方便了用戶操作,增強軟件的易用性,又能有效的規范數據輸入,成為軟件開發人員最常選擇的控件之一。

1.引言

信息和網絡的發展,使基于Web應用的系統越來越普及, VS.Net無疑是開發Web應用的系統的最合適的工具之一。但我們在長期的開發實踐中發現,C#.Net下DropDownList控件在使用過程中會遇到一些問題,它的SelectedIndex屬性存在一個讀寫缺陷,這個問題也一直困擾著其他的開發人員。因此,本文專門對DropDownList做了詳細的測試,來探求問題所在和解決辦法。

2.C# DropDownList控件介紹

DropDownList是C#.Net 控件面板Web Form下的一個控件,它的命名空間是System.Web.UI.WebControls.DropDownList。它是一個允許用戶從下拉列表中選擇一項的控件,通過在C# ropDownList 控件的開始和結束標記之間為每個項放置一個ListItem對象,可以指定希望顯示在C# DropDownList 控件中的項,也支持數據綁定。DropDownList的功能決定了它在日常開發中的實用性,在數據輸入控件中其使用率僅次于TextBox。通過預先設定或動態數據綁定將其填入可供用戶選擇的數據,既方便了用戶操作,增強軟件的易用性,又能有效的規范數據輸入,成為軟件開發人員最常選擇的控件之一。

3.關于SelectedIndex的有趣的問題

在長期的使用過程中我們發現,當在程序中動態將DropDownList列表中的某項選定,

或指定SelectedIndex為某一值時,會出現意想不到的錯誤。而使用斷點跟蹤調試方法或將SelectedIndex值讀取到某個變量進行測試,卻難以找到問題所在。

3.1 發現問題

假設有如下簡單代碼

  1. private void Page_Load(object sender, System.EventArgs e)   
  2.         {   
  3.             if (!IsPostBack)   
  4.             { //初始化DropDownList下拉列表   
  5.                 Init_FillList();   
  6.             }   
  7.         }   
  8.         private void btnOK_Click(object sender, System.EventArgs e)   
  9.         {   
  10.             string strID=txtContinentID.Text.Trim();   
  11.            //選擇指定項   
  12.             listContinent.Items.FindByValue(strID).Selected=true;   
  13.             Response.Write("OK!");   
  14.         }   
  15.         #region初始化下拉列表方法   
  16.         private void Init_FillList()   
  17.         {   //定義ListItem對象   
  18.             ListItem item;   
  19.             //清空列表   
  20.             listContinent.Items.Clear();   
  21.             //寫入列表   
  22.             listContinent.Items.Add(" ");   
  23.             item=new ListItem("亞洲","Asia");   
  24.             listContinent.Items.Add(item);   
  25.             item=new ListItem("歐洲","Euro");   
  26.             listContinent.Items.Add(item);   
  27.             item=new ListItem("美洲","Amer");   
  28.             listContinent.Items.Add(item);   
  29.         }   
  30.         #endregion  

把它放到一個簡單web頁面中直接運行,在輸入框中輸入大洲編號Asia,Euro ,Amer中的任一個,點擊btnOK按鈕鍵,看似沒有任何問題的代碼,報出了如下VS.Net著名的錯誤黃頁:(記為:錯誤A )

C# DropDownList 不能有多個項被選定。

說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。異常詳細信息: System.Web.HttpException: DropDownList 不能有多個項被選定。

通過認真核查代碼并查詢聯機幫助,發現DropDownList的使用符合相關說明文檔的使用方法,沒有任何問題。

為了跟蹤查找錯誤的原因,在btnOK_Click()事件下的所有代碼外圍加try…catch保護進行調試,單步執行,發現一直執行到Response.Write("OK!")句,程序都沒有跳出,繼續向下,此時該事件已經執行完了,沒有錯誤,應該顯示出正常的web頁面,就在這時,上面的錯誤黃頁又出現了。調試無法找到錯誤所在,如何才能解決這個問題,難道是開發工具的原因,于是想到以下辦法.

3.2 問題暫時解決不能有多個項被選定,可能是因為DropDownList在選擇新項之前不能自動去除原來的選擇,即,不能有效的對已添入數據的列表進行初始化。于是在每次PostBack后將DropDownList的數據重新綁定刷新恢復到系統自己規定的默認值,然后再進行新的項的選擇,將Page_Load()事件下的代碼做如下調整 

  1. private void Page_Load(object sender, System.EventArgs e)   
  2. {   
  3. //去掉 if (!IsPostBack)每次都重寫數據   
  4. Init_FillList();   
  5.          } 

此時再運行程序,不再出現錯誤A,運行正常。但是web應用不同于局域網內系統的應用,它對程序執行效率要求更高,要盡量減少對服務器的訪問。如果一個頁面在每次刷新時都要重新訪問服務器初始化數據地話,會嚴重增加服務器的負擔。一旦數據量大或訪問的終端增多,將會使頁面顯示變的非常慢,客戶無法忍受。需要繼續尋求其他的解決辦法。

3.3 有趣的bug由于過去曾經長期從事Delphi下的應用系統的開發,對Combox控件的使用非常熟悉,由于他們的功能基本相同,推斷其使用方法應該也是有些相通的,于是對txtOK_Click()進行修改,得txtOK2_Click()事件:

  1. private void txtOK2_Click(object sender, System.EventArgs e)   
  2.         {      
  3.             string strID=txtContinentID.Text.Trim();   
  4.             this.listContinent.SelectedIndex=-1;//新加行   
  5.             listContinent.Items.FindByValue(strID).Selected=true;   
  6.             Response.Write("OK!");   
  7.          } 

運行程序,果然在加上IsPostBack判斷的情況下,程序仍能正常運行。然而這與msdn聯機幫助對DropDownList的使用說明是不符的。相關的屬性說明:“DropDownList.SelectedIndex 屬性,DropDownList控件中的選定項的索引。默認值為 0,該值選擇列表中的***項。備注 使用 SelectedIndex 屬性以編程方式指定或確定 DropDownList控件中的選定項的索引。DropDownList 控件中總是選擇一項。無法在列表中同時取消選擇所有項。注意 DropDownList 控件中的項的索引從零開始”。有趣的是不符合使用規定的程序沒有報任何錯誤,反而使程序運行正常。

為了查看SelectedIndex在運行時的實際值是0還是1或其他的值,再次跟蹤調試,此時發現了一個有趣的bug。把斷點設置到this.listContinent.SelectedIndex=-1行,當程序運行到這里時將鼠標移到SelectedIndex的位置,查看它的值,(或者通過開發環境下邊的變量查看器查看),發現此時的值是0,繼續向下運行,錯誤A又出現了。而同樣是調試狀態,單步執行代碼,只是不進行查看SelectedIndex的操作(通過變量查看器看也不可以),直到跟蹤完畢,程序運行也沒有問題。很明顯,這是C#.Net的一個bug。

3.4 換一種取值方式既然不能在調試時通過系統的返回值提示查看變量值,只能變通一下,通過自己定義變量來獲取SelectedIndex的值。于是對txtOK2_Click()進行修改,得txtOK3_Click()事件: 

  1.  private void btnOK3_Click(object sender, System.EventArgs e)   
  2.     {   
  3. //新加行 調試后知 i=0   
  4. int i= listContinent.SelectedIndex;   
  5.         string strID=txtContinentID.Text.Trim();   
  6.         this.listContinent.SelectedIndex=-1;   
  7. //新加行 調試后知 j=0   
  8.         int j=this.listContinent.SelectedIndex;   
  9.         listContinent.Items.FindByValue(strID).Selected=true;   
  10.         Response.Write("OK!");   
  11.         }  

運行程序,真正的問題出現了,不管在debug狀態還是非調試狀態,都是一樣的“DropDownList 不能有多個項被選定”錯誤。這說明SelectedIndex的值根本不能進行查看或讀取,這也進一步證明C#.Net中對SelectedIndex的讀取實現代碼有問題,存在不安全的判斷。

另外,經過此時的調試觀察i和j的返回值是一樣的結果,這個結果也和系統規定的SelectedIndex的默認值為 0一致。這證明了this.listContinent.SelectedIndex=-1這行代碼在txtOK2_Click()中是沒有起作用沒有用途的,然而加上該行代碼卻能解決問題,使程序正常運行。

3.5問題根源

通過反編譯工具和.NET源碼的幫助,找到了C#.Net中關于DropDownList的源碼實現,發現了這個問題存在的根源。以下是C#.Net中DropDownList的SelectedIndex屬性源碼實現:

  1. [WebCategory("Behavior"),DesignerSerializationVisibility
  2. (DesignerSerializationVisibility.Hidden),DefaultValue(0),
  3. WebSysDescription("DropDownList_SelectedIndex")]   
  4.  public override int SelectedIndex{      get      
  5. {            int num1 = base.SelectedIndex;            
  6. if ((num1 < 0) && (this.Items.Count > 0))           
  7. {                  
  8. this.Items[0].Selected = true;                  
  9. num1 = 0;            
  10. }            
  11. return num1;      }      
  12. set      
  13. {            
  14. base.SelectedIndex = value;        
  15. }} 

這段源碼實現表明,在取SelectedIndex時自動進行了判斷,只要有數據那么Selected的值就肯定大于等于0,所以我們在查看時發現設置成-1是無效的,它會自動改為0。另外它還做了另外一部操作this.Items[0].Selected = true,這個也就是直接導致Exception產生的原因(開發者只是想看看SelectedIndex它就把Item[0]的Selected值給改了...),所以在調試程序時要注意回避這個問題,我們只能通過修改代碼使程序運行正常,而無法改變 VS.NET的源碼實現。

程序測試界面,btnOK,btnOK2,btnOK3和列表數據綁定代碼的實現已在上面給出。

4.C# DropDownList結束語

經調試,在初始設置SelectedIndex=0的情況下同樣存在“錯誤A”的問題。而且若將3.3中SelectedIndex=-1改為SelectedIndex=0,此中情況程序不調試運行也會出現“錯誤A”。

在系統對效率要求不高,數據量小的情況下可以采用3.2的方法來回避這個問題,即每次加載頁面重新初始化DropDownList列表。也可采取3.3中將SelectedIndex設為-1的方法來改進這一問題,但此時不要對SelectedIndex=-1行進行單行調試。兩種方法在工程交付運行時都不會有任何因為SelectedIndex而引起的程序錯誤。

該文所有測試在Microsoft .NET Framework 1.1, C# .NET 2003 version 7.1,IE6.0 環境下編寫調試。

【編輯推薦】

  1. C# lock關鍵字敘述
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標識符簡單分析
責任編輯:彭凡 來源: CSDN
相關推薦

2018-06-24 16:39:28

Tomcat異常線程

2020-12-12 13:50:16

云開發

2021-01-27 13:54:05

開發云原生工具

2023-05-15 09:16:18

CSSCSS Mask

2024-05-20 01:10:00

Promise變量

2020-02-12 09:00:00

C#編程語言

2022-03-21 10:21:50

jQuery代碼模式

2020-03-10 14:59:16

oracle數據庫監聽異常

2021-03-25 06:12:55

SVG 濾鏡CSS

2012-05-22 10:12:59

jQuery

2023-11-21 21:59:50

c++接口

2022-06-15 07:21:47

鼠標指針交互效果CSS

2022-08-15 22:34:47

Overflow方向裁切

2024-03-18 08:14:07

SpringDAOAppConfig

2021-02-20 16:01:26

Github前端開發

2015-03-12 10:46:30

代碼代碼犯罪

2022-05-20 07:36:02

LiveTerm工具

2017-08-01 00:52:07

kafka大數據消息總線

2012-06-19 16:49:19

Web開發

2013-08-28 09:46:09

Debian LinuLinux發行版
點贊
收藏

51CTO技術棧公眾號

首页亚洲中字| 在线观看男女av免费网址| 久久亚洲欧洲| yw.139尤物在线精品视频| 九九九九九九九九| 成人av影院在线观看| 91丨国产丨九色丨pron| 国产精品视频xxxx| 精品深夜av无码一区二区老年| 婷婷成人综合| 91精品午夜视频| 亚洲美免无码中文字幕在线| 成人在线观看免费| 成人一区在线观看| 国产精品久久久久久久美男 | 欧美日本精品在线| 第四色在线视频| 国产一区二区三区四区五区3d| 亚洲国产精品影院| 视频三区二区一区| 国产aⅴ爽av久久久久成人| 午夜一区不卡| 色综合视频一区中文字幕| 手机看片福利视频| 精品欠久久久中文字幕加勒比| 欧美日韩在线免费视频| 老司机激情视频| 欧美激情二区| 久久久久99精品一区| 国产亚洲情侣一区二区无| 亚洲视频一区在线播放| 小嫩嫩精品导航| 欧美丰满少妇xxxx| 希岛爱理中文字幕| 欧美精选视频在线观看| 亚洲国产精品va在线观看黑人| 999这里有精品| 精品视频在线一区二区在线| 欧美日韩亚洲精品内裤| 2019日韩中文字幕mv| 浪潮av一区| 国产精品日产欧美久久久久| 欧美男人的天堂| 亚洲精品国产片| 国产一区二区视频在线播放| 国产精品视频播放| 啪啪小视频网站| 亚洲一区亚洲| 欧美一级大片视频| 日本三级2019| 激情久久久久| 久久久久免费精品国产| www.av成人| 欧美成人激情| 日韩综合视频在线观看| 91香蕉国产视频| 欧美xxav| 欧美成人免费小视频| 亚洲天堂黄色片| 性xxxx欧美老肥妇牲乱| 久久精品国产亚洲7777| 亚洲欧洲久久| 青青视频在线观| 91麻豆产精品久久久久久| 精品一区二区不卡| 四虎影视精品成人| 亚洲欧美卡通另类91av| 97久久超碰福利国产精品…| 国产无码精品在线观看| 亚洲麻豆一区| 国产91精品久| 国产精品午夜一区二区| 免费一级片91| 91丨九色丨国产在线| 国产99视频在线| 不卡高清视频专区| 久久精品日产第一区二区三区乱码 | 这里只有久久精品| 成人直播大秀| 久久久精品久久久| 国产大片aaa| 久久这里只有| 成人网在线免费看| 欧美一级视频免费| 久久久久久亚洲综合影院红桃| 亚洲成色www久久网站| 快射av在线播放一区| 一区二区在线观看不卡| 你懂的av在线| 国产综合色激情| 精品乱码亚洲一区二区不卡| 亚洲精品视频大全| 99久久夜色精品国产亚洲1000部| 成人97在线观看视频| 精品无码久久久久| 首页国产欧美久久| 999精品视频一区二区三区| 性xxxx视频播放免费| 国产精品乱码妇女bbbb| 国产成人在线小视频| 午夜裸体女人视频网站在线观看| 欧美丝袜丝nylons| 影音先锋资源av| 欧美亚洲激情| 欧美精品成人在线| 中文字幕视频二区| 成人网在线播放| 亚洲欧美久久久久一区二区三区| 麻豆蜜桃在线| 欧美福利视频一区| 人妻无码一区二区三区| 欧美91大片| 国产精品高潮呻吟久久av黑人| av网站免费播放| 国产女人18毛片水真多成人如厕| 青草网在线观看| 日韩成人在线一区| 亚洲精品中文字| 免费网站观看www在线观| 免费久久99精品国产| 久久精精品视频| 性爱视频在线播放| 欧美日韩国产综合视频在线观看 | 国产一区二区在线播放视频| 91美女视频网站| 日韩a级黄色片| 久久亚洲人体| 亚洲深夜福利在线| 国产精彩视频在线观看| 国产在线精品一区二区三区不卡| 欧洲精品码一区二区三区免费看| 蜜桃成人365av| 欧美一区二区免费视频| 亚洲av无一区二区三区| 日韩中文字幕av电影| 国产91av在线| 亚洲黄色小说网址| 亚洲天堂久久久久久久| 色乱码一区二区三区在线| 蜜臀av免费一区二区三区| 久久久免费观看视频| www天堂在线| 亚洲精品美腿丝袜| 亚洲午夜精品在线观看| 中文精品久久| 91热精品视频| 国产在线激情| 欧美一级xxx| 手机在线免费看毛片| 精品一区二区三区不卡| 一区二区三区久久网| 亚洲精品一区三区三区在线观看| 夜夜嗨av色一区二区不卡| 国产又粗又猛又黄视频| 久久精品视频一区| 国产精品人人爽人人爽| 网友自拍一区| 国产成人精品国内自产拍免费看| 日韩精品系列| 色婷婷av一区| 国产亚洲精品精品精品| 久久成人羞羞网站| 特级黄色录像片| 精品伊人久久| 久久久噜噜噜久久中文字免| 深夜影院在线观看| 91成人免费在线视频| 在线观看免费黄色网址| 久久99热狠狠色一区二区| 最近看过的日韩成人| 日本精品在线观看| 91精品国产精品| 麻豆国产在线播放| 欧美精品v国产精品v日韩精品| 美国黄色小视频| www.av亚洲| aaa毛片在线观看| 色小子综合网| 成人av免费看| xxxxx性欧美特大| 色青青草原桃花久久综合| 国产美女免费视频| 亚洲国产成人av| 无码人妻aⅴ一区二区三区69岛| 免费成人美女在线观看.| 国产精品一二三在线观看| 久草精品视频| 国产精品久久久久91| 色呦呦视频在线观看| 日韩成人中文字幕在线观看| 在线观看免费黄色小视频| 亚洲免费观看高清完整版在线观看| fc2成人免费视频| 久久久蜜桃一区二区人| 一本二本三本亚洲码| 红杏视频成人| 国产精品爽爽爽| 高清在线视频不卡| 色多多国产成人永久免费网站| 性中国xxx极品hd| 日本高清视频一区二区| 久久精品女人毛片国产| 日本一区二区在线不卡| 日本美女视频网站| 男女性色大片免费观看一区二区 | 日韩午夜激情av| 亚洲欧美偷拍一区| 一区二区在线电影| 欧美亚洲色综久久精品国产| 成人免费毛片aaaaa**| av无码精品一区二区三区| 欧美日韩国产高清| 亚洲永久激情精品| 亚州国产精品| 国产精品一级久久久| 亚洲福利影视| 国产91九色视频| h片在线观看视频免费免费| 精品国产一区久久久| 国产在线视频网址| 日韩av有码在线| 亚洲第一天堂网| 717成人午夜免费福利电影| 欧美一级淫片免费视频黄| 亚洲国产人成综合网站| 麻豆精品国产免费| 日本一区二区成人| 亚洲一级中文字幕| av电影在线观看一区| 人妻巨大乳一二三区| 捆绑紧缚一区二区三区视频| 国产一级不卡毛片| 亚洲综合丁香| 午夜精品久久久久久久无码| 欧美日韩精选| 乱子伦一区二区| 天天揉久久久久亚洲精品| 色播亚洲婷婷| 欧美亚洲在线日韩| 日本一区免费| 欧美亚洲国产一区| 亚洲欧美99| 久久精品不卡| 一区二区不卡在线观看| 成人羞羞网站入口| 亚洲国产欧洲综合997久久| 国产乱码精品一区二区亚洲| 女同一区二区| 国产欧美一区二区三区精品观看| 欧美大香线蕉线伊人久久| 爽爽窝窝午夜精品一区二区| 欧美国产视频在线观看| 亚洲人成网www| 欧美精品七区| 欧美精品色图| 特级毛片在线免费观看| 亚洲成人最新网站| 欧美日韩激情四射| 在线日本高清免费不卡| 久久婷婷五月综合色国产香蕉| 亚洲欧美不卡| 少妇网站在线观看| 精品无码三级在线观看视频| 久久婷婷中文字幕| 国产大片一区二区| 波多野结衣影院| 久久免费精品国产久精品久久久久| 成人午夜福利一区二区| 中文文精品字幕一区二区| 欧美日韩色视频| 亚洲自拍偷拍综合| 91看片在线播放| 一本色道亚洲精品aⅴ| 中文字幕日韩第一页| 欧美一区二区三区视频在线 | 中文字幕av一区二区| 麻豆传媒免费在线观看| 欧美伦理91i| 天堂中文在线播放| 国产精品99久久久久久久久| 在线观看亚洲精品福利片| 99影视tv| av中文字幕一区二区| 2022中文字幕| 亚洲欧美成人| 男人操女人下面视频| 91尤物视频在线观看| 在线观看天堂av| 午夜精品福利久久久| 亚洲无人区码一码二码三码的含义| 欧美国产日产图区| 免费三片在线播放| 在线精品国精品国产尤物884a| 国产毛片一区二区三区va在线| 亚洲国产天堂久久综合| 一级日本在线| 97av在线视频| 99视频这里有精品| 欧美日韩高清免费| 欧美99在线视频观看| 国产精品wwwww| 国产麻豆91精品| 国产精品免费无码| 亚洲一级不卡视频| 怡红院男人天堂| 日韩激情av在线播放| 国产剧情在线| 国产精品扒开腿做| 国产一区在线电影| 中文字幕av导航| 久久激情婷婷| 国产精品无码在线| 亚洲免费观看在线视频| 正在播放亚洲精品| 亚洲激情成人网| 91小视频xxxx网站在线| 国产精品久久97| 香蕉国产成人午夜av影院| 六月婷婷激情综合| 久久99久久99精品免视看婷婷 | 欧美91在线| 三级在线免费观看| 精品制服美女久久| 蜜桃av乱码一区二区三区| 午夜精品免费在线| 午夜精品久久久久久久爽| zzjj国产精品一区二区| 国产成人a视频高清在线观看| 久久久久久国产精品免费免费| 欧美91大片| 无码人妻一区二区三区在线视频| 欧美韩国一区二区| 日韩黄色片网站| 亚洲欧美第一页| 欧美日韩国产观看视频| 国产一区二区三区奇米久涩| 欧美亚韩一区| 丰满人妻一区二区三区大胸| 18涩涩午夜精品.www| 在线视频播放大全| 色婷婷综合成人av| 欧美视频精品| 在线视频福利一区| 老司机精品视频在线| 人妻无码一区二区三区免费| 色系网站成人免费| 黄色小视频在线免费观看| 日本在线观看天堂男亚洲| 亚瑟一区二区三区四区| 欧美牲交a欧美牲交aⅴ免费真 | 精品国产乱码久久久久久蜜臀| 主播国产精品| 成人午夜电影在线播放| 精品白丝av| 亚洲av成人无码一二三在线观看| 亚洲国产精品自拍| 亚洲三区在线播放| 亲子乱一区二区三区电影| 九九免费精品视频在线观看| 国产又黄又猛视频| 亚洲国产精品精华液2区45| 国产精品乱码一区二区视频| 在线观看精品国产视频| 国产aⅴ精品一区二区四区| 欧美少妇一区二区三区| 粉嫩蜜臀av国产精品网站| 国产在线精品观看| 国产亚洲a∨片在线观看| 欧美日韩破处视频| 大胆欧美熟妇xx| 91亚洲国产成人精品一区二三 | 久草在线视频网站| 狠狠色噜噜狠狠狠狠色吗综合| 美女精品在线| 欧美肥妇bbwbbw| 精品99999| 另类中文字幕国产精品| 日本成人性视频| www.亚洲精品| 成人毛片一区二区三区| www.精品av.com| 国产一区福利| 国产一二三四在线视频| 一区二区三区在线免费视频| 四虎在线免费观看| 91精品综合视频| 黄色国产精品| 一级二级黄色片| 日韩精品在线一区| 婷婷综合六月| 99久热在线精品视频| 久久精品视频一区| 亚洲AV无码成人片在线观看| 欧美一级淫片播放口| 91精品国产福利在线观看麻豆| 久久免费精品国产| 欧美日韩午夜精品| 黄色激情在线播放| 国产四区在线观看| 久久综合成人精品亚洲另类欧美|