C#如何从数组中引用构造函数对象以更新指定患者账户余额
问题核心原因
你现在的代码存在3个核心问题:
- 窗体加载时没有把预设的患者数组绑定到
patientLstBox列表框,导致无法正常选中目标患者 - 拿到列表框选中索引后,没有用这个索引从
patients数组里取出对应的真实患者对象,还是在操作测试用的jerry对象 - 未选中患者弹出提示后,没有终止后续逻辑执行,可能出现空引用异常
具体修改步骤
- 首先删掉全局的测试占位代码:
Patient pat = new Patient("jerry"); - 补充
Form1_Load事件的绑定逻辑,把患者加载到列表框
private void Form1_Load(object sender, EventArgs e) { // 将患者姓名绑定到列表框 foreach (var patient in patients) { patientLstBox.Items.Add(patient.Name); } }
- 修改
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(); }
- 修改
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
相关产品推荐
相关产品推荐

