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

C#如何从数组中引用构造函数对象以更新指定患者账户余额

问题核心原因

你现在的代码存在3个核心问题:

  1. 窗体加载时没有把预设的患者数组绑定到patientLstBox列表框,导致无法正常选中目标患者
  2. 拿到列表框选中索引后,没有用这个索引从patients数组里取出对应的真实患者对象,还是在操作测试用的jerry对象
  3. 未选中患者弹出提示后,没有终止后续逻辑执行,可能出现空引用异常

具体修改步骤

  1. 首先删掉全局的测试占位代码:Patient pat = new Patient("jerry");
  2. 补充Form1_Load事件的绑定逻辑,把患者加载到列表框
private void Form1_Load(object sender, EventArgs e)
{
    // 将患者姓名绑定到列表框
    foreach (var patient in patients)
    {
        patientLstBox.Items.Add(patient.Name);
    }
}
  1. 修改chargeServiceBtn_Click扣费方法的逻辑
private void chargeServiceBtn_Click(object sender, EventArgs e)
{
    AccountUpdate accUpdate = new AccountUpdate();
    string selectedService = "";
    decimal selectedServiceAmt = 0.00m;
    Patient selectedPat = null;

    if (patientLstBox.SelectedItems.Count > 0)
    {
        int index = patientLstBox.SelectedIndex;
        // 用选中索引从数组中取出对应患者对象
        selectedPat = patients[index];
    }
    else
    {
        MessageBox.Show("请从列表框中选择一位患者");
        // 未选中患者直接终止后续操作
        return;
    }

    if (annualPhysicalRBtn.Checked)
    {
        selectedService = annualPhysicalRBtn.Text;
        selectedServiceAmt = 89.00m;
    }
    else if (vaccinationsRBtn.Checked)
    {
        selectedService = vaccinationsRBtn.Text;
        selectedServiceAmt = 159.00m;
    }
    else if (minorIllnessRBtn.Checked)
    {
        selectedService = minorIllnessRBtn.Text;
        selectedServiceAmt = 99.00m;
    }
    else if (minorInjuryRBtn.Checked)
    {
        selectedService = minorInjuryRBtn.Text;
        selectedServiceAmt = 139.00m;
    }
    else
    {
        MessageBox.Show("请选择一项服务");
        return;
    }
    
    // 操作选中的患者对象
    selectedPat.Debit(selectedServiceAmt);

    accUpdate.accountUpdateLbl.Text = "患者:" + selectedPat.Name + "\n" + "服务:" + selectedService + "\n" + "账户扣费金额:" + selectedServiceAmt.ToString("C") + "\n" + "账户余额:" + selectedPat.Account.ToString("c");
    accUpdate.ShowDialog();
}
  1. 修改pay4ServiceBtn_Click入账方法的逻辑
private void pay4ServiceBtn_Click(object sender, EventArgs e)
{
    decimal payment = 0.00m;
    AccountUpdate accUpdate = new AccountUpdate();
    Patient selectedPat = null;

    if (patientLstBox.SelectedItems.Count > 0)
    {
        int index = patientLstBox.SelectedIndex;
        selectedPat = patients[index];
    }
    else
    {
        MessageBox.Show("请从列表框中选择一位患者");
        return;
    }

    if (amountTxtBox.Text.Length > 0 && decimal.TryParse(amountTxtBox.Text, out payment))
    {
        if(payment <=0)
        {
            MessageBox.Show("请输入大于0的金额");
            return;
        }
        selectedPat.Credit(payment);
    }
    else
    {
        MessageBox.Show("请输入有效的入账金额");
        return;
    }

    accUpdate.accountUpdateLbl.Text = "患者:" + selectedPat.Name + "\n" + "账户入账金额:" + payment.ToString("C") + "\n" + "账户余额:" + selectedPat.Account.ToString("c");
    accUpdate.ShowDialog();
}

额外优化说明

入账的金额解析换成了decimal.TryParse避免用户输入非数字内容导致程序崩溃,同时增加了金额合法性校验,你可以根据自己的需求调整。

内容的提问来源于stack exchange,提问作者NessFalcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 04:42:04