You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:57:03