我遇到了一个bug,是客户测试我们的产品,报出来的,而且有异常信息文件,这对于定位问题,很有帮助。

我找到源码看了下,bug还无法重现。于是我随便点点客户端,经过了几次调试,结果报出错误来了。客户端界面如下:

代码如下:

  /// <summary>
/// 选定项发生改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView_EditBibliographys_SelectedIndexChanged(object sender, EventArgs e)
{ if (listView.SelectedItems.Count!= )
{
btnEdit.Enabled = false;
btnDelete.Enabled = false;
btnRenew.Enabled = false;
btnMoveDown.Enabled = false;
btnMoveUp.Enabled = false;
}
else
{
btnEdit.Enabled = true;
btnDelete.Enabled = true;
btnRenew.Enabled = true;
if (listView.SelectedIndices[] != listView.Items.Count - )
{
btnMoveDown.Enabled = true;
}
if (listView.SelectedIndices[] != )
{
btnMoveUp.Enabled = true;
}
}
Samson.NoteFirst.Model.RefStyle.Journal journal = Globals.Journals[Globals.MemoryDataKey];
setCheckBoxes(journal);
if (!isFirst)
{
PageSet();
CheckBoxSet();
}
try
{
index = listView.SelectedIndices[];
}
catch (Exception ex)
{
EventLogProcess.Write(ex);
}
}

代码解释下:9到30行的if   else 是控制编辑引文界面上右侧的按钮的启用和禁用。

40行是获取选中的引文的序号。就是这句报错了。调试发现,原来是listview集合为空,还要取第一项,那当然报错了。报错信息如下:

 <StackTrace>   在 System.Windows.Forms.ListView.SelectedIndexCollection.get_Item(Int32 index)
在 NoteFirst.KMS.Clients.OfficeAddin.EditBibilography.listView_EditBibliographys_SelectedIndexChanged(Object sender, EventArgs e)</StackTrace>
<Message>InvalidArgument=“0”的值对于“index”无效。

这段代码,第九行的判断,令人费解。listView.SelectedItems.Count!= 1,表达意图不明确。万一Count为0,面板右侧的按钮,还是启用状态,显然不合理,甚至会报错。第40行的代码,一点防卫意识都没有,就等着catch,你以为在try里面的东西,就全部安全了吗?try...catch,我认为是针对程序意外情况,你确实提前料想不到的异常处理。比如,读取文件的时候,或者打开数据库连接操作的时候,等等。c#中,经常要做的一个操作,便是判断一个对象是不是为null,或者判断参数的正确与否,如果把一些常规的东西,都包括这try块当中,这有什么意义呢?

以下是我改后的代码:

        /// <summary>
/// 选定项发生改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView_EditBibliographys_SelectedIndexChanged(object sender, EventArgs e)
{ if (listView.SelectedItems.Count == 0 || listView.SelectedItems.Count > 1)
{
btnEdit.Enabled = false;
btnDelete.Enabled = false;
btnRenew.Enabled = false;
btnMoveDown.Enabled = false;
btnMoveUp.Enabled = false;
}
else
{
btnEdit.Enabled = true;
btnDelete.Enabled = true;
btnRenew.Enabled = true;
if (listView.SelectedIndices[0] != listView.Items.Count - 1)
{
btnMoveDown.Enabled = true;
}
if (listView.SelectedIndices[0] != 0)
{
btnMoveUp.Enabled = true;
}
} try
{
if (listView.SelectedIndices.Count > 0)
{
index = listView.SelectedIndices[0];
}
}
catch (Exception ex)
{
EventLogProcess.Write(ex);
}
}

  

c# winform中的一段代码赏析的更多相关文章

  1. Qt源码包中的一段代码

    之所以单独拣出来是因为Qt的开发者们给普通开发者提供了高效编程的商业代码例子: bool QWidget::testAttribute_helper(Qt::WidgetAttribute attri ...

  2. WPF和Winform中picturebox图片局部放大

    原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...

  3. 《Focus On 3D Terrain Programming》中一段代码的注释三

    取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...

  4. 《Focus On 3D Terrain Programming》中一段代码的注释二

    取自<Focus On 3D Terrain Programming>中的一段: bool CTERRAIN::MakeTerrainFault( int iSize, int iIter ...

  5. 《Focus On 3D Terrain Programming》中一段代码的注释一

    取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...

  6. 怎么知道RTL Schematic中的instance与哪段代码对应呢

    2013-06-23 20:15:47 ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”.对于一个简单的设计,比如 ...

  7. javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数

    javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...

  8. js中闭包来实现bind函数的一段代码的分析

    今天研究了一下bind函数,发现apply和call还可以有这样的妙用,顺便巩固复习了闭包. var first_object = { num: 42 }; var second_object = { ...

  9. Winform 中写代码布局中遇到的控件遮盖问题

    在winform中编程时,需要动态向主窗体中增加菜单栏和用户控件,菜单栏需要设置DockStyle为Top ,而设置用户控件的DockStyle为Fill,之后在加载的时候,出现了菜单栏遮盖用户控件的 ...

随机推荐

  1. ajaxfileupload批量上传文件+图片尺寸限制

    1.首先展示ajaxfileupload代码,在这里修改为批量上传 //ajaxfileupload不展示全部代码,这是修改前与修改后代码对比,目的是上传多个文件 createUploadForm: ...

  2. CENTOS6.6下nmon的监控

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn Installing Nmon By default nmon is ...

  3. PHP入门学习精要

    一.文件名 函数.配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求): ThinkPHP的模板文件默认是以.html 为后缀(可以通过配置修改): 二.其它命名 其它命名 规则 ...

  4. 有关datatables的非常规教程

    有关datatables的非常规教程 1. //$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust(); table. ...

  5. JavaScript那些事

    1.定义静态常量:     const C=1; 该常量不能变化的. 2.在if判断中如果是两个变量比较js会将一个字符和一个数字比较的话,会将字符转换成数字然后在对这两个进行对比: var num= ...

  6. vim编辑器——常用操作整理

    注意:以下的操作都是在命令状态下进行的,不要进入插入状态了.参考这里 1.删除 dd       删除一行 ndd    删除以当前行开始的n行dw    删除以当前字符开始的一个字符ndw   删除 ...

  7. 微信小程序--TabBar不出现的一种原因

    转自 http://blog.csdn.net/yedouble/article/details/54089825 pages数组的第一项必须是tabBar的list数组的一员. quedian无法返 ...

  8. Jpa中设置OneToMany插入报异常解决办法

    在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...

  9. R+OCR︱借助tesseract包实现图片文本提取功能

    2016年11月,Jeroen Ooms在CRAN发布了tesseract包,实现了R语言对简单图片的文本提取.分析功能. 利用开源OCR引擎进行图片处理,目前可以识别超过100种语言,R语言可以借助 ...

  10. Meet Python

    关于python 入门书<Head First Python>的一些读书笔记,用以备忘. 下载安装Python 下载地址: https://www.python.org/downloads ...