2013-07-31 23 views
0

更新:只要在類2向前輸入值,那麼顯示的唯一結果就是最後輸入的輸入。例如:如果在class1行和class2行中輸入數據,則僅顯示class2行的計算結果。有人能告訴我爲什麼會發生這種情況嗎?一些數據在計算時正在丟失

gpa Calculator

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 

namespace Grade_Point_Average_Calculator 
{ 
    public partial class GPA_Calculator : Form 
    { 
     SaveFileDialog saveFileDialog1; 

     public GPA_Calculator() 
     { 
      InitializeComponent(); 
     } 

     private void GPA_Calculator_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      Application.Exit(); 
     } 


     // Closes application after exitToolStripMenuItem_Click 
     private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 


     // Displays information about the application version number and creator 
     private void aboutToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Version 1.0., "About"); 
     } 

     private void calculateBtn_Click(object sender, EventArgs e) 
     { 
      int maskbox1, maskbox2, maskbox3, maskbox4, maskbox5, maskbox6; 

     CalculatorLogics oCalculatorLogics1 = new CalculatorLogics(this); 
     oCalculatorLogics1.SelectedGrade = double.Parse(comboBox1.SelectedValue.ToString()); 
     if (!int.TryParse(maskedTextBox1.Text, out maskbox1)) 
     { 
      maskbox1 = 0; // Assign zero is parse fails 
     } 
     else 
     { 
      oCalculatorLogics1.CourseCredit = int.Parse(maskedTextBox1.Text); 
     } 
     oCalculatorLogics1.performGpaCalculations(); 
     answerLabel.Text = oCalculatorLogics1.CalcGrade.ToString(); 


     CalculatorLogics oCalculatorLogics2 = new CalculatorLogics(this); 
     oCalculatorLogics2.SelectedGrade =   double.Parse(comboBox2.SelectedValue.ToString()); 
     if (!int.TryParse(maskedTextBox2.Text, out maskbox1)) 
     { 
      maskbox2 = 0; // Assign zero is parse fails 
     } 
     else 
     { 
      oCalculatorLogics2.CourseCredit = int.Parse(maskedTextBox2.Text); 
     } 
     oCalculatorLogics2.performGpaCalculations(); 
     answerLabel.Text = oCalculatorLogics2.CalcGrade.ToString(); 

     } 
    } 
} 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Grade_Point_Average_Calculator 
{ 
    class CalculatorLogics 
    { 

     private double grade; 
     private double gradeValue; 
     private double calculateGrades; 
     private int credits; 
     private GPA_Calculator _GPA_Calculator; 

     // Pass form to CalculatorLogics constructor 
     public CalculatorLogics(GPA_Calculator theGPA_Calculator) 
     { 
      _GPA_Calculator = theGPA_Calculator; 
     } 

     public double SelectedGrade 
     { 
      get { return grade; } 
      set { grade = value; } 
     } 

     public int CourseCredit 
     { 
      get { return credits; } 
      set { credits = value; } 
     } 

     public double CalcGrade 
     { 
      get 
      { 
      return calculateGrades; 
      } 
     } 

     public void performGpaCalculations() 
     { 
      gradeVal = grade * credits; 
      totalCredits += credits; // Add the amount of credits 
      totalGradeValue += gradeVal; 

      calculateGrades = totalGradeValue/totalCredits; // Calculates gpa 
      return calculateGrades; 
     } 
    } 
} 
+0

哪一部分,特別是,你有麻煩? –

+0

問題是什麼?您嘗試與其他窗口窗體進行交互的位置在哪裏? –

+0

您需要在CalcGrade屬性設置爲任何正確之前調用performGpaCalculations方法? –

回答

2

正如代碼代表,您的問題是,你是不是要求你CalculatorLogics類的performGpaCalculations()方法,這導致從CalcGrade屬性返回的calculateGrades值爲默認值一個double(0.0)。

你需要調用performGpaCalculations()方法在你的代碼,就像這樣:

private void calculateBtn_Click(object sender, EventArgs e) 
{ 
    CalculatorLogics oCalculatorLogics = new CalculatorLogics(); 
    oCalculatorLogics.performGpaCalculations(); 
    answerLabel.Text = oCalculatorLogics.CalcGrade.ToString(); 
} 

這將使CalcGrade類確定的calculateGrades值。

UPDATE:

但你真正的問題是,你是實例化窗體類GPA_Calculator,它吹走了用戶選擇的值的新實例。

相反,你需要將GPA_Calculator形式的類的實例傳遞給您的CalculatorLogics類的構造函數,像這樣:

public CalculatorLogics(GPA_Calculator theGPA_Calculator) 
{ 

} 

現在你的形式被傳遞給構造函數,你需要在某處存儲它使CalculatorLogics類可以使用它,這裏是你的CalculatorLogics類的重寫以支持這一點:最後

public class CalculatorLogics 
{ 
    private double grade; 
    private double gradeValue; 
    private double calculateGrades; 
    private int credits; 
    private GPA_Calculator _GPA_Calculator; 

    public CalculatorLogics(GPA_Calculator theGPA_Calculator) 
    { 
     _GPA_Calculator = theGPA_Calculator; 
    } 

    public double SelectedGrade 
    { 
     get { return grade; } 
     set { grade = value; } 
    } 

    public int CourseCredit 
    { 
     get { return credits; } 
     set { credits = value; } 
    } 

    public double CalcGrade 
    { 
     get 
     { 
     return calculateGrades; 
     } 
    } 

    public void performGpaCalculations() 
    { 
     const double grade_A = 4.00; 
     const double grade_A_minus = 3.67; 
     const double grade_B_plus = 3.33; 
     const double grade_B = 3.00; 
     const double grade_B_minus = 2.67; 
     const double grade_C_plus = 2.33; 
     const double grade_C = 2.00; 
     const double grade_C_minus = 1.67; 
     const double grade_D = 1.33; 
     const double grade_F = 0.00; 

     switch (_GPA_Calculator.comboBox1.SelectedItem.ToString()) 
     { 
      case "A": 
       gradeValue = grade_A; 
       break; 
      case "A-": 
       gradeValue = grade_A_minus; 
       break; 
      case "B+": 
       gradeValue = grade_B_plus; 
       break; 
      case "B": 
       gradeValue = grade_B; 
       break; 
      case "B-": 
       gradeValue = grade_B_minus; 
       break; 
      case "C+": 
       gradeValue = grade_C_plus; 
       break; 
      case "C": 
       gradeValue = grade_C; 
       break; 
      case "C-": 
       gradeValue = grade_C_minus; 
       break; 
      case "D": 
       gradeValue = grade_D; 
       break; 
      case "F": 
       gradeValue = grade_F; 
       break; 
     } 
     calculateGrades = gradeValue * credits; 
    } 
} 

,當你實例化你CalculatorLogics類,你將需要傳遞給表單的引用你在,這樣的:

CalculatorLogics oCalculatorLogics = new CalculatorLogics(this); 

注:this是指向類本身,在這種情況下,GPA_Calculator形式。

+0

是的,這是我正在做的。 –

1

要獲取組合框的選定值,它不會幫助只創建表單類的新實例。

相反,你可以將目前的形式傳遞給像方法:

public void performGpaCalculations(GPA_Calculator form) 

或更好的只是通過選定的項目清單:

public void performGpaCalculations(int[] selectedValues) 

INT [],因爲我會建議你不使用組合框的selectedItem,而是使用selectedIndex並創建一個靜態等級數組

double[] grades = {4.00, 3.67, // ... 

so y你不需要那個開關。

更新: 好的,上面的答案已經更新了我寫的內容,所以我的回答將不再有幫助...