目前我有两个按钮。一个人创建一个Patient对象并向其添加费用详细信息,并将继续为每次点击添加这些详细信息的其他副本,然后将这些副本添加到Patientlist中。
第二个按钮应该创建一个Patient对象的新实例,这样它也可以通过上面描述的相同过程。
问题是,当按下第二个按钮时,它会创建一个Patient对象的新实例,但该列表会丢失先前的患者对象。
我觉得我错过了一些完全过于明显的东西,并通过复制视频,youtube教程以及SO本身的相关问题回过头来看。
static List<Patient> PatientsList()
{
List<Patient> patientList = new List<Patient>();
return patientList;
}
private void AddAddOn_Click(object sender, EventArgs e)
{
// Set the data on the patient, name etc.
patient.PatientFirstName = PatientFirstNameInput.Text;
patient.PatientLastName = PatientLastNameInput.Text;
patient.PatientCopay = Convert.ToDecimal(PatientCopayInput.Text);
patient.BillId = BillIdInput.Text;
Charge charge;
// Does the patient already have a Charge in their list?
if (patient.ChargeList.Count == 0)
{
// - if not, add a new charge
charge = new Charge();
patient.ChargeList.Add(charge);
}
else
{
// - if that's the case, use the existing charge but update info
charge = patient.ChargeList.First();
}
// Add a charge to the patient's list of charges
charge.DateofService = DateofServiceInput.Value.ToString("yyyyMMdd");
charge.PrimaryProcedureCode = PrimaryProcedureInput.Text;
charge.PrimaryChargeCost = Convert.ToDecimal(PrimaryChargeInput.Text);
charge.PrimaryChargeContractualAdjustment = Convert.ToDecimal(PrimaryAdjustmentInput.Text);
charge.PrimaryPaymentAmount = Convert.ToDecimal(PrimaryPaidInput.Text);
// Set the name of the Patient
// Create a new Charge
// Create an add-on charge and add it to the Charge
AddonCharge newAddonCharge = new AddonCharge();
newAddonCharge.AddonProcedureCode = AddonProcedureInput.Text;
newAddonCharge.AddonChargeCost = Convert.ToDecimal(AddonChargeInput.Text);
newAddonCharge.AddonContractualAdjustment = Convert.ToDecimal(AddonAdjustmentInput.Text);
newAddonCharge.AddonPaymentAmount = Convert.ToDecimal(AddonPaidInput.Text);
charge.AddonChargeList.Add(newAddonCharge);
List<Patient> patientList = PatientsList();
patientList.Add(patient);
//newCharge.AddonChargeList.Add(newAddonCharge);
}
private void AddtoListButton_Click(object sender, EventArgs e)
{
//return a new patient with null details
Patient patient = new Patient();
List<Patient> patientlist = PatientsList();
// Show a messagebox with the string
//MessageBox.Show(EDIToString());
}
答案 0 :(得分:1)
如前面的答案所示,您的问题是您在每次调用时都会重新创建患者列表。 static
关键字不会更改此内容。
通过初始化患者列表字段,我已经更改了代码以解决问题。
private List<Patient> PatientsList = new List<Patient>();
private void AddAddOn_Click(object sender, EventArgs e)
{
// Set the data on the patient, name etc.
patient.PatientFirstName = PatientFirstNameInput.Text;
patient.PatientLastName = PatientLastNameInput.Text;
patient.PatientCopay = Convert.ToDecimal(PatientCopayInput.Text);
patient.BillId = BillIdInput.Text;
Charge charge;
// Does the patient already have a Charge in their list?
if (patient.ChargeList.Count == 0)
{
// - if not, add a new charge
charge = new Charge();
patient.ChargeList.Add(charge);
}
else
{
// - if that's the case, use the existing charge but update info
charge = patient.ChargeList.First();
}
// Add a charge to the patient's list of charges
charge.DateofService = DateofServiceInput.Value.ToString("yyyyMMdd");
charge.PrimaryProcedureCode = PrimaryProcedureInput.Text;
charge.PrimaryChargeCost = Convert.ToDecimal(PrimaryChargeInput.Text);
charge.PrimaryChargeContractualAdjustment = Convert.ToDecimal(PrimaryAdjustmentInput.Text);
charge.PrimaryPaymentAmount = Convert.ToDecimal(PrimaryPaidInput.Text);
// Set the name of the Patient
// Create a new Charge
// Create an add-on charge and add it to the Charge
AddonCharge newAddonCharge = new AddonCharge();
newAddonCharge.AddonProcedureCode = AddonProcedureInput.Text;
newAddonCharge.AddonChargeCost = Convert.ToDecimal(AddonChargeInput.Text);
newAddonCharge.AddonContractualAdjustment = Convert.ToDecimal(AddonAdjustmentInput.Text);
newAddonCharge.AddonPaymentAmount = Convert.ToDecimal(AddonPaidInput.Text);
charge.AddonChargeList.Add(newAddonCharge);
List<Patient> patientList = PatientsList;
patientList.Add(patient);
//newCharge.AddonChargeList.Add(newAddonCharge);
}
private void AddtoListButton_Click(object sender, EventArgs e)
{
//return a new patient with null details
Patient patient = new Patient();
List<Patient> patientlist = PatientsList;
// Show a messagebox with the string
//MessageBox.Show(EDIToString());
}
答案 1 :(得分:0)
您的问题始于此静态方法:
static List<Patient> PatientsList()
{
List<Patient> patientList = new List<Patient>();
return patientList;
}
每次打电话,都会创建一个全新的病人清单。
以下几行:
List<Patient> patientList = PatientsList();
patientList.Add(patient);
将创建一个全新的空列表,然后将患者添加到其中。下次调用时,会再次发生相同的事情,之前的患者不再被存储。
解决问题的最佳方法是将PatientsList()
方法转换为字段,如下所示:
private readonly List<Patient> patientList = new List<Patient>();
作为一个字段,patientList
字段将在构造类时自动初始化。
readonly关键字是可选的,但它基本上可以防止将字段重新分配给其他内容。
来自MSDN:
readonly关键字是一个可以在字段上使用的修饰符。当一个 字段声明包括一个只读修饰符,赋值给 声明引入的字段只能作为其中的一部分出现 声明或在同一类的构造函数中。
现在,当您想要将患者添加到列表中时,您只需要通过按钮点击方法调用patientList.Add(patient);
。
答案 2 :(得分:-1)
您有一个静态方法,用于创建患者列表,感觉您希望它只被调用一次。不是这种情况。静态只意味着它可以在没有任何类实例的情况下访问。
您正在寻找的是将列表作为您班级的成员,并且只有在之前未创建该列表时才创建该列表。
尝试在方法之外添加
List<Patient> patientList = new List<Patient>();
并删除您对PatientsList();
的调用