Проблема класса C # - объект не распознается - PullRequest
1 голос
/ 06 июня 2011

Я столкнулся с проблемой в этой программе, из-за которой я не могу заставить мой метод 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;
        }
    }


}

образец текстового файла:

Мэри Р. Программист

1237

17 авеню Северного Вяза

789-1000

40,0

15.00

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Одной из проблем является следующая строка кода внутри события openToolStripMenuItem1_Click:

Employee employ = new Employee(emphours, hourpay);

Экземпляр employ должен иметь достаточно широкую область видимости для других событий в форме, чтобыдоступ к нему.

Таким образом, я предлагаю поместить Employee employ; на уровне формы и изменить событие openToolStripMenuItem1_Click на:

employ = new Employee(emphours, hourpay);

Затем вы можете ссылаться на кнопку занятости на кнопкесобытие клика по желанию.

1 голос
/ 06 июня 2011

Ваш класс 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 и получить значение.В качестве предложения, теперь, когда вы можете увидеть, как работает объект, вы знаете, что вам не нужно явно добавлять EmpHours и EmpHoursPay к методу CalcPay.Вам нужно было бы сделать это, только если объект был статичным.

0 голосов
/ 06 июня 2011

CalcPay - это метод вашего класса Employee, чтобы вызвать этот метод, вы должны иметь возможность ссылаться на экземпляр класса. Вы создаете экземпляр этого класса в обработчике события элемента stripmenu, но не сохраняете его для дальнейшего использования.

Таким образом, вам нужно либо создать глобальную переменную, либо переменную уровня формы для хранения экземпляра (который вы создаете в обработчике полосового меню), но вы также должны быть осторожны: создание экземпляра и использование его из разных обработчиков событий означает, что ваш пользователь должен убедиться, что все сделано в правильном порядке ... или что вы делаете такие вещи, как 1. / проверить, что экземпляр не является нулевым, прежде чем вызывать его (вы должны сделать это в любом случае) и 2. / возможно, только включите кнопку calc после создания переменной Employee.

Еще один момент ... назовите свои элементы пользовательского интерфейса!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...