C#类问题 - 无法识别对象

时间:2011-06-05 21:42:55

标签: c# streamreader

我在这个程序中遇到了一个问题,我不能让我的Calcpay方法在正确的位置输出,输出错误。我希望它在单击computepay按钮时输出,但是它没有识别那里的对象,当我将textbox7放在openToolStripMenuItem1_Click下进行测试时,无论如何它都显示为0。 在此先感谢您的任何帮助

    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;
        }
    }


}

示例文本文件是:

  

Mary R. Programmer

     

1237

     

17 North Elm Avenue

     

789-1000

     

40.0

     

15.00

3 个答案:

答案 0 :(得分:2)

一个问题是openToolStripMenuItem1_Click事件中的以下代码行:

Employee employ = new Employee(emphours, hourpay);

实例employ需要具有足够宽的范围,以便表单上的其他事件可以访问它。

因此,我建议在表单级别添加Employee employ;并将openToolStripMenuItem1_Click事件更改为:

employ = new Employee(emphours, hourpay);

然后您可以根据需要在按钮点击事件中引用就业。

答案 1 :(得分: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方法。如果对象是静态的,您只需要这样做。

答案 2 :(得分:0)

CalcPay是您的Employee类的一种方法,为了调用该方法,您需要能够引用该类的实例。您可以在stripmenu项目事件处理程序中创建该类的实例,但不要将其存储在任何位置以供以后使用。

因此,您需要创建一个全局或表单级别变量来存储实例(您在条带菜单处理程序中创建),但您还需要小心,创建实例并从不同的事件处理程序中使用它意味着你的用户必须确保按照正确的顺序完成任务......或者你做的事情是1. /测试实例在调用之前不是null(你应该这样做)和/或者只是在创建Employee var之后启用calc按钮。

还有一点......命名你的UI元素!