尝试将新项添加到列表时,我正在删除列表,而不是创建要添加到列表中的新对象

时间:2017-01-19 21:34:37

标签: c# winforms list static-methods

目前我有两个按钮。一个人创建一个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());

    }

3 个答案:

答案 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();

的调用