.NET C# WinForms计算器点击空白区抛InvalidCastException异常求助
解决WinForms计算器点击空白区域抛出InvalidCastException的问题
嘿,这个问题我太熟悉了!咱们先搞清楚为啥会出现这个异常:
你写的btn_nclick方法是用来处理按钮点击事件的,但现在这个方法大概率被不小心绑定到了窗体(Form)的Click事件上。当你点击窗体空白区域时,sender参数传递的是窗体对象,而不是Button,这时候你强行把它转成Button就会触发System.InvalidCastException。
给你两个解决方案,从根源和防御性编程两个层面来处理:
方案1:修正事件绑定(推荐,从根源解决)
打开WinForms设计器,或者检查你的代码:
- 找到所有类似
this.Click += btn_nclick;的代码,把它删掉 - 确保只有计算器的数字/符号按钮的Click事件绑定到
btn_nclick方法
这样以后点击窗体空白区域就不会触发这个方法,自然不会有异常。
方案2:在方法内做类型检查(防御性编程)
如果担心以后不小心绑错事件,或者想让方法更健壮,可以在方法开头先判断sender是不是Button类型,不是就直接退出:
private void btn_nclick(object sender, EventArgs e) { // C# 7.0+ 支持的模式匹配,一步完成类型判断和赋值 if (!(sender is Button b)) { return; } if ((txt_resultado.Text == "0")||(operation_pressed)) { txt_resultado.Clear(); } operation_pressed = false; if (b.Text == ",") { if (!txt_resultado.Text.Contains(",")) txt_resultado.Text = txt_resultado.Text + b.Text; } else txt_resultado.Text = txt_resultado.Text + b.Text; }
如果你的项目用的是C# 7.0以下版本,可以用as操作符来实现:
private void btn_nclick(object sender, EventArgs e) { Button b = sender as Button; // 如果sender不是Button,b会是null,直接返回 if (b == null) { return; } // 后续原有逻辑不变... if ((txt_resultado.Text == "0")||(operation_pressed)) { txt_resultado.Clear(); } operation_pressed = false; if (b.Text == ",") { if (!txt_resultado.Text.Contains(",")) txt_resultado.Text = txt_resultado.Text + b.Text; } else txt_resultado.Text = txt_resultado.Text + b.Text; }
这样不管sender是什么类型,只要不是Button,方法就会直接退出,不会执行后续的强制转换操作,也就避免了异常。
内容的提问来源于stack exchange,提问作者LooksPerfect
相关产品推荐
相关产品推荐

