c# winform中的一段代码赏析
我遇到了一个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中的一段代码赏析的更多相关文章
- Qt源码包中的一段代码
之所以单独拣出来是因为Qt的开发者们给普通开发者提供了高效编程的商业代码例子: bool QWidget::testAttribute_helper(Qt::WidgetAttribute attri ...
- WPF和Winform中picturebox图片局部放大
原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...
- 《Focus On 3D Terrain Programming》中一段代码的注释三
取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...
- 《Focus On 3D Terrain Programming》中一段代码的注释二
取自<Focus On 3D Terrain Programming>中的一段: bool CTERRAIN::MakeTerrainFault( int iSize, int iIter ...
- 《Focus On 3D Terrain Programming》中一段代码的注释一
取自<Focus On 3D Terrain Programming>中的一段: //--------------------------------------------------- ...
- 怎么知道RTL Schematic中的instance与哪段代码对应呢
2013-06-23 20:15:47 ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”.对于一个简单的设计,比如 ...
- javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数
javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...
- js中闭包来实现bind函数的一段代码的分析
今天研究了一下bind函数,发现apply和call还可以有这样的妙用,顺便巩固复习了闭包. var first_object = { num: 42 }; var second_object = { ...
- Winform 中写代码布局中遇到的控件遮盖问题
在winform中编程时,需要动态向主窗体中增加菜单栏和用户控件,菜单栏需要设置DockStyle为Top ,而设置用户控件的DockStyle为Fill,之后在加载的时候,出现了菜单栏遮盖用户控件的 ...
随机推荐
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- NumPy学习_00 ndarray的创建
1.使用array()函数创建数组 参数可以为:单层或嵌套列表:嵌套元组或元组列表:元组或列表组成的列表 # 导入numpy库 import numpy as np # 由单层列表创建 a = np. ...
- HZAU 1199: Little Red Riding Hood 01背包
题目链接:1199: Little Red Riding Hood 思路:dp(i)表示前i朵花能取得的最大价值,每一朵花有两种选择,摘与不摘,摘了第i朵花后第i-k到i+k的花全部枯萎,那么摘的话d ...
- kubernetes 命令使用
学会命令的查找和使用,而不是死记命令,记命令不如提高英文水平 1.kubernetes环境搭建完成后,kubernetes环境搭建参考http://www.cnblogs.com/sosogengdo ...
- Go基础之--操作Mysql(一)
关于标准库database/sql database/sql是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库.它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现. ...
- caffe错误
一些caffe错误 训练时很快梯度爆炸,loss猛增至nan 如果找不到数据上的原因的话,可以怀疑caffe框架有问题,换用其它版本试试.比如我遇到的问题是在训练时使用了Accuracy层,而该层的实 ...
- qwe 简易深度框架
qwe github地址 简介 简单的深度框架,参考Ng的深度学习课程作业,使用了keras的API设计. 方便了解网络具体实现,避免深陷于成熟框架的细节和一些晦涩的优化代码. 网络层实现了Dense ...
- R︱mlr包帮你挑选最适合数据的机器学习模型(分类、回归)+机器学习python和R互查手册
一.R语言的mlr packages install.packages("mlr")之后就可以看到R里面有哪些机器学习算法.在哪个包里面. a<-listLearners() ...
- JAVA代码发送邮件示例和解释(二)
之前有使用过一次在程序中发邮件的功能,也写了一篇相关的笔记,当时使用的是163邮箱,经过测试多个163账号都是可行的.但是最近把账号换成中国移动@chinamobilesz.com这种结尾的时候,却一 ...
- AndroidDevTools
收集整理Android开发所需的Android SDK.开发中用到的工具.Android开发教程.Android设计规范,免费的设计素材等. 欢迎大家推荐自己在Android开发过程中用的好用的工具. ...