2011-06-05 47 views
1

我遇到了一個問題,在這個程序中,我不能讓我的Calcpay方法輸出在正確的位置,它的輸出錯誤。我希望它在點擊computepay按鈕時輸出,但它不會識別那裏的對象,當我把textbox7置於openToolStripMenuItem1_Click下測試它時,它反而出現爲0。 預先感謝任何幫助C#類的問題 - 對象不被識別

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     //opens about page 
     private void aboutToolStripMenuItem_Click(object sender, EventArgs e) 
     {   
     } 
     //closes program 
     private void exitToolStripMenuItem1_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
     //reads in data from text file, assigns to textboxes. 
     private void openToolStripMenuItem1_Click(object sender, EventArgs e) 
     { 
      double emphours; 
      double hourpay; 
      Stream myStream = null; 
      OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
      openFileDialog1.InitialDirectory = "c:\\"; 
      openFileDialog1.Filter = "text files (*.txt)|*txt"; 
      if (openFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       if ((myStream = openFileDialog1.OpenFile()) != null) 
       { 
        StreamReader data = new StreamReader(myStream); 
        textBox1.Text = data.ReadLine(); 
        textBox4.Text = data.ReadLine(); 
        textBox2.Text = data.ReadLine(); 
        textBox3.Text = data.ReadLine(); 
        emphours = double.Parse(data.ReadLine()); 
        hourpay = double.Parse(data.ReadLine()); 
        Employee employ = new Employee(emphours, hourpay); 
        textBox5.Text = Convert.ToString(employ.EmpHours); 
        textBox6.Text = Convert.ToString(employ.EmpHourPay); 
       } 
      } 
     } 
     // The CalcPay_Clickmethod 
     // display employee net pay 
          private void computepay_Click(object sender, EventArgs e) 
     { 
        // need to get calcpay method to output here 
           //textbox7.Text = xx 
     } 
       } 
      } 

     public class Employee 
    { 

     const int TimeAndAHalfMarker = 40; 
     const double Federaltax = .20; 
     const double Statetax = .075; 
     const double TimeAndAHalf = 0.5; 
     private double netpay, grossPay, stateTax, federalTax; 
     public double EmpHours { get; private set; } 

     public double EmpHourPay { get; private set; } 

     public Employee(double emphours, double emphourpay) 
     { 
      EmpHours = emphours; 
      EmpHourPay = emphourpay; 
     } 

     public double Calcpay(double emphours, double emphourpay) 
     { 

      EmpHours = emphours; 
      EmpHourPay = emphourpay; 
      if (EmpHours > TimeAndAHalfMarker) 
       grossPay += (((EmpHours - TimeAndAHalfMarker) * EmpHourPay) * TimeAndAHalf); 
      federalTax = grossPay * Federaltax; 
      stateTax = grossPay * Statetax; 
      netpay = grossPay - stateTax - federalTax; 

      return netpay; 
     } 
    } 


} 

示例文本文件是:

瑪麗R.程序員

17北榆大道

789-1000

40.0

15.00

+0

這是有史以來問題的最佳標題...你有很多意見。 – 2011-06-05 21:53:08

回答

2

的一個問題是下面的代碼行中,openToolStripMenuItem1_Click事件中:

Employee employ = new Employee(emphours, hourpay); 

實例employ需要有一個範圍足夠寬的其他活動表單來訪問它。

因此我建議在形式層面把Employee employ;,改變openToolStripMenuItem1_Click事件說:

employ = new Employee(emphours, hourpay); 

那麼你可以參考可以根據需要在按鈕單擊事件使用。

1

您的Employee類不是靜態的,必須實例化。您已完成此操作:

Employee employ = new Employee(emphours, hourpay); 

但是,您只在該代碼塊的範圍內聲明employ。相反,請在課堂級別進行申報。例如:

Employee employ 
public Form1() 
{ 
    InitializeComponent(); 
} 

Employee對象現在可以在該類的任何位置使用。

在您單擊處理程序:

private void computepay_Click(object sender, EventArgs e) 
{ 

     textbox7.Text = employ.CalcPay(employ.EmpHours, employ.EmpHoursPay).ToString(); 
} 

因爲employ整個班級現已推出,該對象可以調用CalcPay方法和獲得的價值。作爲一個建議,現在你可以看到對象是如何工作的,你知道你不需要明確地將EmpHoursEmpHoursPay添加到CalcPay方法中。如果對象是靜態的,你只需要這樣做。

0

CalcPay是您的Employee類的一種方法,爲了調用該方法您需要能夠引用該類的一個實例。您可以在stripmenu項目事件處理程序中創建該類的實例,但不會將其存儲在任何地方供以後使用。

因此,您需要創建一個全局或表單級變量來存儲實例(您在strip菜單處理程序中創建的實例),但是您還需要小心,創建實例並使用它從不同的事件處理程序你的用戶必須確保事情按照正確的順序完成......或者你做了這樣的事情1.在調用它之前測試實例是否爲空(你應該這樣做)2.也許Employee Var創建後才啓用Calc按鈕。

還有一點...爲您的UI元素命名!