2016-12-07 7 views
-2

Я работаю над этой программой со вчерашнего дня, но я не знаю причину проблемы. Когда, я запускаю программу и вводя сумму, которую нужно перевести с «Проверка учетной записи на Сберегательную учетную запись», программа вычитает введенную сумму из учетной записи «Проверка», но не добавляет к сберегательной учетной записи.Перевод с расчетного счета?

Как решить эту проблему? Любая помощь приветствуется.

public partial class Transfer : Window 
{ 
    private string PIN; 
    Accounts AccountsList = new Accounts(); 

    //constructor 
    public Transfer(string pin, Accounts myAcounts) 
    { 
     InitializeComponent(); 
     AccountsList = myAcounts; 
     PIN = pin; 
    } 

    //save to file method 
    public void saveToFile() 
    { 
     using (StreamWriter sw = new StreamWriter("Acounts.txt")) 
     { 
      for (int i = 0; i < AccountsList.Count; i++) 
      { 
       var data = new List<string> 
       { 
        AccountsList[i].ACCOUNTYPE.ToString() 
        ,AccountsList[i].PIN 
        ,AccountsList[i].ACCOUNTNUMBER 
        ,AccountsList[i].ACCOUNTBALANCE.ToString() 
       }; 

       var account = String.Join(";", data); 
       sw.WriteLine(account); 
      } 
     } 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      string txtAmount = txtAmountInTransfer.Text; 
      double amount = 0; 

      bool AmountCorrect = double.TryParse(txtAmount, out amount); 

      Account chequingAccount = new Account(); 
      Account savingAccount = new Account(); 

      //deposit from CHEQUING ACCOUNT to SAVING ACCOUNT 
      { 
       //validate user entries 

       for (int i = 0; i < AccountsList.Count; i++) 
       { 
        //withdraw from CHEQUING ACCOUNG 
        if (AccountsList[i].ACCOUNTYPE == 'C' && AccountsList[i].PIN == PIN) 
        { 
         if (rbChequing_to_Saving.IsChecked == true) 
         { 
          chequingAccount = AccountsList[i]; 
         } 
         else 
         { 
          savingAccount = AccountsList[i]; 
         } 

         chequingAccount.ACCOUNTBALANCE -= amount; 
         AccountsList[i].ACCOUNTBALANCE += amount; 


         //saveToFile(); 
         //break; 

        } 
        //if (AccountsList[i].ACCOUNTYPE == 'S') 
        // savingAccount.ACCOUNTBALANCE += amount; 

        //saveToFile(); 
       } 


      } 


     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 


} 

}

ответ

0

С этим утверждением, вы фактически копируете ссылку не значение.

chequingAccount = AccountsList[i]; 

Таким образом, оба они имеют одинаковую ссылку.

chequingAccount.ACCOUNTBALANCE -= amount; 
AccountsList[i].ACCOUNTBALANCE += amount; 

вы вычитаете сумму x, а затем добавляете х сумму обратно к ней. Вам нужно дважды проверить свою логику.

Вот хорошая статья о типа значения против ссылочного типа http://www.tutorialsteacher.com/csharp/csharp-value-type-and-reference-type

+0

Можете ли вы мне немного объяснить, пожалуйста, с новым C# – afgboy

+0

@afgboy: Поскольку Account (класс) является ссылочным типом, когда вы выполняете 'chequingAccount = AccountsList [i];', вы копируете ссылку 'AccountsList [i ] '' 'chequingAccount'. Поэтому, если вы измените любой из них, это повлияет на значение в другом. Читайте о ** Типы значений Vs Reference types **. – DarkKnight

0

Я удивлён вы говорите, вычитает из проверки. Мое чтение кода имеет либо добавление, либо ничего не делает для проверки.

Причина, когда вы попадаете в код +/-, который вы, возможно, установили chequingAccount = AccountsList[i] на основе логического из GUI ... иначе это вновь созданная учетная запись, которой нет в вашем AccountsList.

Таким образом, ваши +/- код приводит либо:

AccountsList[i].ACCOUNTBALANCE -= amount; 
AccountsList[i].ACCOUNTBALANCE += amount; 

Или

(new Account()).ACCOUNTBALANCE -= amount; 
AccountsList[i].ACCOUNTBALANCE += amount; 

Где-то вам нужно найти сберегательный счет.

Я также заметил, что вы не проверяете номер задней учетной записи, а только PIN-код. Если у двух учетных записей есть один и тот же PIN-код, вы не можете вычесть из правой учетной записи.