精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91精品国产色综合久久ai换脸 | 免费欧美激情| 欧美午夜激情小视频| 视频一区二区综合| av高清一区二区| 亚洲影院免费| 久久福利视频网| 精品成人av一区二区三区| 伊人久久大香伊蕉在人线观看热v| 一区二区三区精品久久久| 欧美日韩一区在线播放| 国产高清在线免费| 免费日韩一区二区| 欧美成人一区在线| 中文字幕网站在线观看| 国产精品三p一区二区| 精品视频999| 怡红院av亚洲一区二区三区h| 欧美成年黄网站色视频| 成人不卡免费av| 国产剧情日韩欧美| 久久久免费高清视频| 欧美久久综合| 精品激情国产视频| 亚洲国产天堂av| 欧美变态网站| 日韩欧美国产电影| 国产精品自在自线| 成人福利一区二区| 色狠狠一区二区三区香蕉| 青青在线视频免费观看| 黄色成人影院| 国产精品美日韩| 欧美日本韩国国产| 污污视频在线免费看| 国产精品一区二区视频| 国产精品视频久久久久| 久久精品五月天| 国产精品日韩| 51ⅴ精品国产91久久久久久| 精品无码久久久久久久| 欧美视频四区| 久久99精品久久久久久琪琪| 四虎永久免费在线| 中文字幕日韩一区二区不卡 | 白白色在线观看| 亚洲免费三区一区二区| 一区二区三区欧美成人| 91在线网址| 亚洲国产高清在线| 视频一区二区在线观看| chinese偷拍一区二区三区| 久久综合九色综合97婷婷| 久久亚洲综合网| 五月婷婷丁香网| 91理论电影在线观看| 久久久影院一区二区三区| 天堂网在线资源| 97超碰欧美中文字幕| 国产久一道中文一区| 日本人妻熟妇久久久久久 | 91精品黄色| av中文在线观看| 国产99久久久精品| 国产偷国产偷亚洲高清97cao| 国产综合在线播放| 97久久人人超碰| 欧美日韩综合精品| yw视频在线观看| 国产精品久久综合| 无码人妻精品一区二区蜜桃百度| yellow91字幕网在线| 一区二区三区中文字幕精品精品| 性一交一乱一伧国产女士spa| 岛国av在线播放| 精品免费在线视频| 狠狠热免费视频| 亚洲欧洲日韩精品在线| 精品免费日韩av| 亚洲专区区免费| 99久久这里只有精品| 欧美猛男性生活免费| 在线能看的av| 精品一区二区三区不卡| 国产乱码精品一区二区三区卡| 九一国产在线| 亚洲人成网站精品片在线观看| 福利在线小视频| 欧美gv在线| 欧美精品在线观看播放| 88av在线播放| 日韩精品免费| 91精品国产91久久久久福利| 91精品国自产| 99久精品国产| 最新中文字幕久久| 在线观看特色大片免费视频| 91麻豆精品国产无毒不卡在线观看 | 777777国产7777777| 最新日韩欧美| 成人情趣片在线观看免费| 欧美 日韩 国产 精品| 国产欧美日韩在线| 国产成人在线小视频| 成人国产精品| 日韩精品在线视频观看| 精品国产视频一区二区三区| 国产欧美午夜| 92看片淫黄大片看国产片| 欧美老女人性开放| 一区二区欧美国产| 日韩在线不卡一区| 亚洲精品**不卡在线播he| 欧美成人手机在线| 在线免费观看一区二区| av不卡免费电影| av久久久久久| 日韩毛片免费看| 亚洲视屏在线播放| 日韩欧美亚洲视频| 国产麻豆欧美日韩一区| 天堂精品一区二区三区| jizzjizz中国精品麻豆| 91精品国产一区二区三区香蕉| 精品成人av一区二区三区| 亚洲经典在线| 国产精品10p综合二区| 日本中文字幕在线看| 色国产精品一区在线观看| 色天使在线视频| 雨宫琴音一区二区在线| 999热视频在线观看| 欧美精品videos另类| 欧美影片第一页| 日本少妇高潮喷水xxxxxxx| 亚洲精品一级| 精品午夜一区二区三区| 高清在线视频不卡| 亚洲国产精品成人一区二区| 麻豆91精品91久久久| 国产伦精品一区二区三区免费迷| 中文字幕欧美人与畜| 国产精品久久久久久久久久齐齐| 亚洲色图国产精品| 伦av综合一区| 国产亚洲精品bt天堂精选| 乱子伦视频在线看| 久久99视频| 国产精品福利观看| 午夜不卡视频| 制服.丝袜.亚洲.另类.中文 | 欧美3p视频在线观看| 岛国av一区二区三区| 黄色正能量网站| 亚洲免费综合| 日韩高清dvd| 欧美视频精品| 久久精品国产电影| 性猛交富婆╳xxx乱大交天津| 亚洲少妇屁股交4| 国产美女视频免费看| 自拍偷拍欧美| 国产精品一区二区在线观看| 色综合桃花网| 中文字幕日本精品| 国产成人精品白浆久久69| 亚洲一区二区三区视频在线| 一级欧美一级日韩片| 国产精品入口66mio| 亚洲精品9999| 精品久久国产一区| 国内精品久久久久| 国产精品一区二区三区四区色| 欧美影院精品一区| 私库av在线播放| 91麻豆国产福利精品| 亚洲欧美国产日韩综合| 亚洲情侣在线| 久久久久久久久久码影片| 成人av色网站| 久久免费成人精品视频| 美女毛片在线看| 欧美顶级少妇做爰| 日韩三级一区二区三区| 欧美国产欧美综合| 东京热av一区| 毛片基地黄久久久久久天堂| 日本男女交配视频| 欧美码中文字幕在线| 99re视频在线播放| 成人国产激情在线| 久久久噜噜噜久噜久久| 阿v免费在线观看| 亚洲第一中文字幕| 亚洲综合五月天婷婷丁香| 午夜成人免费视频| 国产精品精品软件男同| 成人高清免费观看| 天堂在线中文在线| 欧美一级播放| 菠萝蜜视频在线观看入口| 欧美老女人另类| 久久人人97超碰人人澡爱香蕉| 日本成人一区二区| 日本韩国在线不卡| 精品精品导航| www.亚洲一区| 国产在线观看网站| 亚洲国产精品字幕| 国产精品美女一区| 在线观看成人小视频| 日韩av片在线播放| 亚洲女厕所小便bbb| 天天操天天干天天操天天干| 99天天综合性| 在线中文字日产幕| 激情国产一区二区| 手机在线看福利| 免费日韩精品中文字幕视频在线| 男人天堂a在线| 一区二区在线| 中文字幕免费在线不卡| 欧美军人男男激情gay| 欧美二级三级| 亚洲专区视频| 好看的日韩精品视频在线| 日韩中文字幕无砖| 91在线视频导航| 四虎视频在线精品免费网址| 国产精品草莓在线免费观看| 黄色软件视频在线观看| 欧美激情一二三| 三级网站视频在在线播放| 久久久国产一区二区| 亚洲xxxxxx| 日韩一中文字幕| 2017亚洲天堂1024| 自拍亚洲一区欧美另类| seseavlu视频在线| 中文字幕免费精品一区| 触手亚洲一区二区三区| 国产亚洲精品久久久久久| 欧美午夜黄色| 亚洲天堂av电影| yw193.com尤物在线| 丝袜亚洲另类欧美重口| 在线中文资源天堂| 久久亚洲国产精品| 新版中文在线官网| 久久久欧美精品| 国产99在线| 国产精品mp4| 51一区二区三区| 国产一区二区在线免费视频| 久久日本片精品aaaaa国产| 国产欧美va欧美va香蕉在| 未满十八勿进黄网站一区不卡| 成人免费看吃奶视频网站| 秋霞午夜一区二区三区视频| 99在线影院| 里番精品3d一二三区| 久久精品日韩精品| 成人在线视频免费观看| 欧美日韩视频免费在线观看| 欧美1区2区| 免费黄色福利视频| 喷白浆一区二区| 毛毛毛毛毛毛毛片123| youjizz久久| 亚洲国产av一区| 中文字幕一区二区三区在线播放| av成人免费网站| 精品久久久国产| 中文字幕丰满人伦在线| 欧美丰满少妇xxxxx高潮对白| 国产 欧美 精品| 亚洲人成伊人成综合网久久久| fc2在线中文字幕| 欧美激情性做爰免费视频| 亚洲成a人片| 3d动漫啪啪精品一区二区免费 | 蜜桃av一区二区在线观看| 亚洲天堂国产视频| 成人免费毛片嘿嘿连载视频| 人妻体内射精一区二区| 亚洲品质自拍视频网站| 成年人免费高清视频| 欧美视频日韩视频| 免费观看黄色av| www.日韩.com| a日韩av网址| 亚洲精品免费网站| 国产精品免费99久久久| 天堂а√在线中文在线| 久久青草久久| 美国黄色一级视频| 中文天堂在线一区| 日本黄色片视频| 在线电影院国产精品| 天堂成人在线| 欧美精品生活片| 成人18视频在线观看| 激情欧美一区二区三区中文字幕| 日韩一区自拍| 美女av免费在线观看| 国产黄色成人av| 99在线视频免费| 欧美日韩在线视频一区| 99久久婷婷国产一区二区三区| 国产丝袜精品第一页| 中文在线手机av| 国产在线视频欧美| 国产尤物久久久| 成人午夜视频在线观看免费| 极品少妇xxxx精品少妇偷拍| 午夜精产品一区二区在线观看的| 性感美女久久精品| 国产高清免费av| 久久精品99久久久香蕉| 日本综合久久| 久久久com| 亚洲久久成人| 69亚洲乱人伦| 亚洲一区免费观看| 国产不卡精品视频| 久久精品国产91精品亚洲| 久久免费影院| 五月天亚洲综合小说网| 久久在线精品| 瑟瑟视频在线观看| 疯狂蹂躏欧美一区二区精品| 免费a视频在线观看| 欧美另类在线播放| 欧美成人精品午夜一区二区| 热这里只有精品| 久久99最新地址| 美国一级片在线观看| 欧美日韩五月天| 91在线导航| 国产在线观看一区二区三区| 99国产精品一区二区| 中文字幕永久有效| 亚洲欧洲av色图| 国产视频手机在线观看| 久久综合免费视频影院| 国产精品视频一区视频二区 | 精品一区二区国产| 一本一本久久| 自拍偷拍视频亚洲| 欧美三级蜜桃2在线观看| 888av在线| 51蜜桃传媒精品一区二区| 欧美福利在线| 岛国av免费观看| 黑人极品videos精品欧美裸| 青青久草在线| 国产精品成人播放| 99久久亚洲精品蜜臀| 激情小说欧美色图| 精品成人在线视频| 免费在线超碰| 国产在线视频91| 国自产拍偷拍福利精品免费一| 少妇极品熟妇人妻无码| 欧美视频在线视频| aaa在线免费观看| 亚洲一区二区中文| 亚洲精品韩国| 久久丫精品忘忧草西安产品| 9191精品国产综合久久久久久| 国产亚av手机在线观看| 久久伊人一区| 麻豆精品国产传媒mv男同 | 日本福利在线| 福利视频一区二区三区| 国产精品久久久久9999高清| 人妻少妇无码精品视频区| 欧美日本韩国一区| 成人性生交大片免费看在线播放| 精品一区二区不卡| 老司机一区二区| 在线看成人av| 中文国产亚洲喷潮| 日本高清精品| 黄色片在线免费| 亚洲一区二区三区自拍| 免费看男男www网站入口在线 | 99国产精品欲| 欧美在线xxx| 综合亚洲视频| 色噜噜日韩精品欧美一区二区| 欧美老肥妇做.爰bbww| 2020国产在线| 亚洲三区视频| www国产成人| 成人激情四射网| 国产精品久久久久久久美男 | 另类小说第一页| 亚洲一区二区四区蜜桃| 99riav在线|