VB.NET下Grid控件值取值范围设置的警告处理及代码优化问题
问题解答
1. 如何避免触发BC42019警告
该警告的触发原因是DataGridViewCell.Value属于Object类型,直接对Object类型的操作数使用比较运算符时,编译器无法确认类型匹配性,因此抛出类型安全警告。
无需手动添加#Disable Warning/#Enable Warning指令,只要提前将Value值显式转换为确定的数值类型,编译器识别到操作数均为数值类型后,警告就会自动消失。
2. 保留现有代码和警告是否会抛出运行时异常
是否抛异常由运行时的实际数据决定:
- 如果运行时
tsamp列的Value始终为可隐式转换为数值的类型,无空值、非数值类型的内容,VB会自动完成隐式类型转换,不会抛出异常 - 如果运行时出现空值(
DBNull.Value)、字符串等无法隐式转为数值的内容,会直接抛出类型转换失败的运行时异常,存在稳定性隐患
3. 更优的代码编写方式
优化逻辑如下:
- 避免重复读取同一个单元格的Value,统一读取转换后存入变量,减少冗余代码同时提升执行效率
- 增加空值和类型合法性判断,避免运行时类型转换异常
- 可使用
Math.Clamp方法直接完成数值区间钳位,无需写两个If判断逻辑(如果运行环境为.NET Framework 4.5以下不支持Math.Clamp,可以换回If判断,依旧使用转换后的变量操作即可)
优化后代码示例:
' 读取p列的值做分支判断 Dim pVal As Single = CSng(dgv_config.Item(dgv_config.Columns("p").Index, rowindex).Value) Select Case pVal Case 1 To 150 ' 提前获取tsamp列单元格对象 Dim tsampCell = dgv_config.Item(dgv_config.Columns("tsamp").Index, rowindex) ' 空值/非数值合法性判断 If tsampCell.Value Is DBNull.Value OrElse Not IsNumeric(tsampCell.Value) Then tsampCell.Value = 50 ' 非法值设置默认值 Else Dim tsampVal As Single = CSng(tsampCell.Value) ' 钳位到50~400区间 tsampCell.Value = Math.Clamp(tsampVal, 50, 400) End If End Select
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

