C#类问题-未识别对象

C#类问题-未识别对象,c#,streamreader,C#,Streamreader,我在这个程序中遇到了一个问题,我不能让我的Calcpay方法在正确的位置输出,它的输出是错误的。我希望它在单击computepay按钮时输出,但它无法识别那里的对象,当我将textbox7放在openToolStripMenuItem1\u单击进行测试时,结果显示为0。 提前谢谢你的帮助 public partial class Form1 : Form { public Form1() { InitializeCompon

我在这个程序中遇到了一个问题,我不能让我的Calcpay方法在正确的位置输出,它的输出是错误的。我希望它在单击
computepay
按钮时输出,但它无法识别那里的对象,当我将
textbox7
放在
openToolStripMenuItem1\u单击
进行测试时,结果显示为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;
        }
    }


}
示例文本文件是:

玛丽·R·程序员

1237

北榆树大道17号

789-1000

40.0

15:00


一个问题是
openToolStripMenuItem1\u单击事件中的以下代码行:

Employee employ = new Employee(emphours, hourpay);
实例
employ
需要有足够宽的作用域,以便表单上的其他事件访问它。

因此我建议把
员工雇佣并更改
openToolStripMenuItem1\u单击
事件以显示:

employ = new Employee(emphours, hourpay);

然后,您可以根据需要在按钮单击事件中引用employ。

您的Employee类不是静态的,必须实例化。你已经做到了:

Employee employ = new Employee(emphours, hourpay);
但是,您已经声明
仅在该代码块的范围内使用
。相反,在类级别声明它。例如:

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
方法并获取值。作为建议,现在您可以了解对象的工作方式,您知道不需要显式地将
EmpHours
EmpHoursPay
添加到
CalcPay
方法中。只有在对象是静态的情况下,才需要执行此操作

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

因此,您需要创建一个全局变量或表单级变量来存储实例(在strip菜单处理程序中创建),但也需要小心,创建实例并从不同的事件处理程序中使用它意味着您的用户必须确保事情按照正确的顺序完成……或者您需要执行以下操作:1./在调用实例之前测试实例是否为null(无论如何,您应该这样做);2./可能仅在创建Employee var后启用calc按钮


还有一点…命名你的UI元素

这是有史以来最好的问题标题。。。你可以看到很多风景。