C#如何正确使用实例引用解决Winforms非静态成员访问报错问题
核心问题原因
你遇到的报错本质是混淆了窗体类(Calculate是类名)和窗体实例对象的概念,Winforms里拖放生成的控件、默认的事件方法都是实例成员,必须通过已经创建好的窗体实例访问,不能直接用类名调用。
第一步:回滚错误的static修改
先把你改成public static void的Peoplenumber_TextChanged方法改回原来的实例方法(去掉static关键字),事件方法不能声明为static,它需要和当前窗体的控件实例绑定,改成static之后设计器自动生成的事件绑定逻辑(通过实例引用挂载事件)会直接失效,触发第二个报错。
// 恢复为原始的实例方法即可 public void Peoplenumber_TextChanged(object sender, EventArgs e) { }
第二步:正确使用实例访问控件
分两种常见场景处理:
- 场景1:计算逻辑写在Calculate窗体自身的代码里
直接用this关键字指代当前窗体实例,也可以省略this直接访问控件:
InitializeComponent(); // 直接访问当前窗体的控件,不需要加类名Calculate string pnumber = Peoplenumber.Text; int peoplenumber = int.Parse(Peoplenumber.Text); int daynumber = int.Parse(Daynumber.Text); int Totalcost = int.Parse(totalcost.Text); int TripBasicCost = Totalcost / daynumber; int TripDayCost = TripBasicCost / peoplenumber;
- 场景2:计算逻辑写在其他窗体/类的代码里
需要先拿到已经打开的Calculate窗体的实例对象再访问,比如你是点击按钮打开Calculate窗体的,就把实例提前存储下来:
// 声明全局变量存储Calculate的实例 private Calculate _calculateForm; // 打开Calculate窗体的逻辑 private void OpenCalculateFormBtn_Click(object sender, EventArgs e) { if(_calculateForm == null || _calculateForm.IsDisposed) { _calculateForm = new Calculate(); _calculateForm.Show(); } else { _calculateForm.Activate(); } } // 后续访问控件时用存好的实例调用 int peoplenumber = int.Parse(_calculateForm.Peoplenumber.Text);
额外注意项
- 如果需要跨窗体访问控件,需要在设计器里把对应控件的
Modifiers属性改成Public,否则外部类没有访问权限 - 输入转int时建议用
int.TryParse做异常校验,避免用户输入非数字内容时程序直接崩溃
内容的提问来源于stack exchange,提问作者user16513171
相关产品推荐
相关产品推荐

