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

本文关键字:识别 对象 问题 | 更新日期: 2023-09-27 17:58:23

我在这个程序中遇到了一个问题,我无法让我的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.程序员

1237

北埃尔姆大道17号

789-1000

40.0

15.00

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

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

Employee employ = new Employee(emphours, hourpay);

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

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

employ = new Employee(emphours, hourpay);

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

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方法中。只有当对象是静态的时,才需要执行此操作。

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

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

还有一点。。。命名您的UI元素!