返回顶部
首页 > 资讯 > 精选 >C# DropDownList的bug怎么解决
  • 508
分享到

C# DropDownList的bug怎么解决

2023-06-17 23:06:58 508人浏览 独家记忆
摘要

本篇内容主要讲解“C# DropDownList的bug怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C# DropDownList的bug怎么解决”吧!1.引言 信息和网络的发展,使基

本篇内容主要讲解“C# DropDownList的bug怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C# DropDownList的bug怎么解决”吧!

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值读取到某个变量进行测试,却难以找到问题所在。

1 发现问题

假设有如下简单代码

private void Page_Load(object sender, System.EventArgs e)           {               if (!IsPostBack)               { //初始化DropDownList下拉列表                   Init_FillList();               }           }           private void btnOK_Click(object sender, System.EventArgs e)           {               string strID=txtContinentID.Text.Trim();              //选择指定项               listContinent.Items.FindByValue(strID).Selected=true;               Response.Write("OK!");           }           #region初始化下拉列表方法           private void Init_FillList()           {   //定义ListItem对象               ListItem item;               //清空列表               listContinent.Items.Clear();               //写入列表               listContinent.Items.Add(" ");               item=new ListItem("亚洲","Asia");               listContinent.Items.Add(item);               item=new ListItem("欧洲","Euro");               listContinent.Items.Add(item);               item=new ListItem("美洲","Amer");               listContinent.Items.Add(item);           }           #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页面,就在这时,上面的错误黄页又出现了。调试无法找到错误所在,如何才能解决这个问题,难道是开发工具的原因,于是想到以下办法.

2 问题暂时解决不能有多个项被选定,可能是因为DropDownList在选择新项之前不能自动去除原来的选择,即,不能有效的对已添入数据的列表进行初始化。于是在每次PostBack后将DropDownList的数据重新绑定刷新恢复到系统自己规定的默认值,然后再进行新的项的选择,将Page_Load()事件下的代码做如下调整

private void Page_Load(object sender, System.EventArgs e)   {   //去掉 if (!IsPostBack)每次都重写数据   Init_FillList();            }

此时再运行程序,不再出现错误A,运行正常。但是web应用不同于局域网内系统的应用,它对程序执行效率要求更高,要尽量减少对服务器的访问。如果一个页面在每次刷新时都要重新访问服务器初始化数据地话,会严重增加服务器的负担。一旦数据量大或访问的终端增多,将会使页面显示变的非常慢,客户无法忍受。需要继续寻求其他的解决办法。

3 有趣的bug由于过去曾经长期从事Delphi下的应用系统的开发,对Combox控件的使用非常熟悉,由于他们的功能基本相同,推断其使用方法应该也是有些相通的,于是对txtOK_Click()进行修改,得txtOK2_Click()事件:

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

运行程序,果然在加上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。

4 换一种取值方式既然不能在调试时通过系统的返回值提示查看变量值,只能变通一下,通过自己定义变量来获取SelectedIndex的值。于是对txtOK2_Click()进行修改,得txtOK3_Click()事件:

 private void btnOK3_Click(object sender, System.EventArgs e)       {   //新加行 调试后知 i=0   int i= listContinent.SelectedIndex;           string strID=txtContinentID.Text.Trim();           this.listContinent.SelectedIndex=-1;   //新加行 调试后知 j=0           int j=this.listContinent.SelectedIndex;           listContinent.Items.FindByValue(strID).Selected=true;           Response.Write("OK!");           }

运行程序,真正的问题出现了,不管在debug状态还是非调试状态,都是一样的“DropDownList 不能有多个项被选定”错误。这说明SelectedIndex的值根本不能进行查看或读取,这也进一步证明C#.Net中对SelectedIndex的读取实现代码有问题,存在不安全的判断。

另外,经过此时的调试观察i和j的返回值是一样的结果,这个结果也和系统规定的SelectedIndex的默认值为 0一致。这证明了this.listContinent.SelectedIndex=-1这行代码在txtOK2_Click()中是没有起作用没有用途的,然而加上该行代码却能解决问题,使程序正常运行。

5问题根源

通过反编译工具和.NET源码的帮助,找到了C#.Net中关于DropDownList的源码实现,发现了这个问题存在的根源。以下是C#.Net中DropDownList的SelectedIndex属性源码实现:

[WebCateGory("Behavior"),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),DefaultValue(0),WebSysDescription("DropDownList_SelectedIndex")]    public override int SelectedIndex{      get      {            int num1 = base.SelectedIndex;            if ((num1 < 0) && (this.Items.Count > 0))           {                  this.Items[0].Selected = true;                  num1 = 0;            }            return num1;      }      set      {            base.SelectedIndex = value;        }}

这段源码实现表明,在取SelectedIndex时自动进行了判断,只要有数据那么Selected的值就肯定大于等于0,所以我们在查看时发现设置成-1是无效的,它会自动改为0。另外它还做了另外一部操作this.Items[0].Selected = true,这个也就是直接导致Exception产生的原因(开发者只是想看看SelectedIndex它就把Item[0]的Selected值给改了...),所以在调试程序时要注意回避这个问题,我们只能通过修改代码使程序运行正常,而无法改变 VS.NET的源码实现。

程序测试界面,btnOK,btnOK2,btnOK3和列表数据绑定代码的实现已在上面给出。

到此,相信大家对“C# DropDownList的bug怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C# DropDownList的bug怎么解决

本文链接: https://lsjlt.com/news/294190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C# DropDownList的bug怎么解决
    本篇内容主要讲解“C# DropDownList的bug怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C# DropDownList的bug怎么解决”吧!1.引言 信息和网络的发展,使基...
    99+
    2023-06-17
  • Debian中vim的Bug怎么解决
    这篇“Debian中vim的Bug怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Debian中vim的Bug怎么解决...
    99+
    2023-06-27
  • yarn的bug问题怎么解决
    本篇内容主要讲解“yarn的bug问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“yarn的bug问题怎么解决”吧!1、问题描述最近接手的几个项目包管理器用的是 yarn@v1.22....
    99+
    2023-07-04
  • Linux内核Bug怎么解决
    本篇内容介绍了“Linux内核Bug怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一个bug,  有人升级内核到V5.10...
    99+
    2023-06-15
  • MySQL JDBC驱动bug怎么解决
    本篇内容介绍了“MySQL JDBC驱动bug怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.1...
    99+
    2024-04-02
  • 电脑KB4535996新bug怎么解决
    这篇文章主要讲解了“电脑KB4535996新bug怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑KB4535996新bug怎么解决”吧!KB4535996新bugWindows ...
    99+
    2023-07-01
  • mybatisplus+pgsql查询bug怎么解决
    这篇“mybatisplus+pgsql查询bug怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatisplu...
    99+
    2023-07-05
  • 怎么使用chatgpt解决隐藏的bug
    本篇内容主要讲解“怎么使用chatgpt解决隐藏的bug”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用chatgpt解决隐藏的bug”吧!隐藏的“间谍”下面先来看代码(伪代码)codep...
    99+
    2023-07-06
  • IE6的CSS双倍边距BUG怎么解决
    本文小编为大家详细介绍“IE6的CSS双倍边距BUG怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“IE6的CSS双倍边距BUG怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2024-04-02
  • HTML标准下出现的bug怎么解决
    这篇文章主要讲解了“HTML标准下出现的bug怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML标准下出现的bug怎么解决”吧! 1. 设置p...
    99+
    2024-04-02
  • 怎么解决IE6中奇数宽高的BUG
    这篇文章将为大家详细讲解有关怎么解决IE6中奇数宽高的BUG,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如图:可是在IE6下查看,却变成了right:1px的效果了:IE6还有奇数宽高的bug,解决方案...
    99+
    2023-06-08
  • jQueryv3.3.1的BUG如何解决
    这篇文章主要讲解了“jQueryv3.3.1的BUG如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jQueryv3.3.1的BUG如何解决”吧!发现问题最新版的 FineUIPro ...
    99+
    2023-07-05
  • 怎么解决MySQL xtrabackup 2.4.12备份触发的bug
    本篇文章为大家展示了怎么解决MySQL xtrabackup 2.4.12备份触发的bug,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、背景与现象: ...
    99+
    2024-04-02
  • springboot跨域问题带来的BUG怎么解决
    这篇文章主要介绍了springboot跨域问题带来的BUG怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot跨域问题带来的BUG怎么解决文章都会有所收获,下面我们一起来看看吧。需求前端用...
    99+
    2023-06-27
  • mybatisplus+pgsql查询bug的解决
    最近公司把底层数据库,改换成了pgsql,之前一直是用的mysql。可是换了pgsql之后,现在发现跟mybatisplus集成上,居然出现了一些很奇怪的bug。 这是sys_use...
    99+
    2023-03-19
    mybatisplus pgsql查询bug mybatisplus pgsql查询
  • ProxyStrike运行bug的解决办法
    ProxyStrike运行bug的解决办法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 ProxyStrike运行bug解决办法由于curl中参数C...
    99+
    2023-06-04
  • 如何解决IE6的3像素bug
    这篇文章主要讲解了“如何解决IE6的3像素bug”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决IE6的3像素bug”吧!一、 6爷我喝高了,最后一行...
    99+
    2024-04-02
  • springBoot解决static和@Component遇到的bug
    目录static和@Component遇到的bugstatic和@Componet的名词解释@Autowired和static的关系发生的场景原理剖析  解决方案static和@Co...
    99+
    2024-04-02
  • IE6 BUG的解决方法有哪些
    这篇“IE6 BUG的解决方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“IE6 ...
    99+
    2024-04-02
  • jQuery v3.3.1的BUG以及解决办法(附解决方案)
    发现问题 最新版的 FineUIPro v5.2.0 中,我们将内置的 jQuery v1.12.4 升级到 jQuery v3.3.1 ,可以看升级记录: +升级到jQuery v...
    99+
    2023-03-13
    jQuery v3.3.1的BUG
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作