reobi04 Ответов: 1

Сохранение значений в объекте, но не будет сохранено должным образом


Это для графического приложения, где я читаю информацию из файла о заработной плате компании. У меня возникли проблемы с сохранением значений в моем объекте Employee. Во время отладки я наблюдал значения внутри моего класса form1 и класса Employee, и они верны в моем классе form, но не изменятся по сравнению со значениями, в которых они инициализированы в моем классе Employee.

Вот мой код класса формы

public partial class Form1 : Form
    {
        //declare constants
        const int EMPLOYEE_MAX = 10;

        //a class level reference to Employee
        private Employee Employee;

        public Form1()
        {
            InitializeComponent();
            
            //create an Employee object
            Employee = new Employee();
        }

        //The aboutToolStripMenuItem Method
        //Purpose: To inform the user about the program
        //Parameters: The object generating the event
        //and the events arguments
        //Returns: None
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Garrett Bills\nCS 1400\nProject 12");
        }

        //The exitToolStripMenuItem Method
        //Purpose: To allow the user to exit the program
        //Parameters: The object generating the event
        //and the events arguments
        //Returns: None
        private void exitToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //The openToolStripMenuItem
        //Purpose: To allow the user to select a file to open
        //Paramets: The object generating the event
        //and the events arguments
        //Returns: None
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //declare variables and arrays
            int employeeNumber1 = 0;
            string employeeName1 = "";
            string employeeAddress1 = "";
            double hourlyWage1 = 0.0;
            double hoursWorked1 = 0.0;
            string fileInput = "";
            int numEmployees = 0;
            Employee[] employeeInfo = new Employee[EMPLOYEE_MAX];            
            string[] hourInfoInput = new string[EMPLOYEE_MAX];

            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 employeeData = new StreamReader(myStream);
                    
                    //begin if statement
                    while (fileInput != null)
                    {
                        fileInput = employeeData.ReadLine();

                        if (fileInput == null)
                        {
                            break;
                        }
                        else
                        {
                            
                            employeeNumber1 = int.Parse(fileInput);
                            fileInput = employeeData.ReadLine();
                            employeeName1 = fileInput;
                            Employee.SetEmployeeName(employeeName1);
                            fileInput = employeeData.ReadLine();
                            employeeAddress1 = fileInput;
                            fileInput = employeeData.ReadLine();
                            hourInfoInput = fileInput.Split();
                            hourlyWage1 = double.Parse(hourInfoInput[0]);
                            hoursWorked1 = double.Parse(hourInfoInput[1]);
                            employeeInfo[numEmployees++] = new Employee(employeeNumber1, employeeName1, employeeAddress1,
                                 hourlyWage1, hoursWorked1);
                            numEmployees++;
                        }
                        
                    }                    
                }
            }
        }


а вот мой код из моего класса сотрудников
//declare data members
        private int employeeNumber;
        private string employeeName;
        private string employeeAddress;
        private double hourlyWage;
        private double hoursWorked;

        //default constructor
        //Purpose: Initialize all values to zeros or empty strings
        //Parameters: None
        //Returns: None
        public Employee()
        {
            employeeNumber = 0;
            employeeName = "";
            employeeAddress = "";
            hourlyWage = 0.0;
            hoursWorked = 0.0;
        }

        //parameterized constructor
        //Purpose: to initialize all values
        //Parameters: An int(the employee number), two strings (the employees name and
        //address), and two doubles(the employees hourly wage and  hours worked)
        //Returns: None
        public Employee(int empNum, string empName, string empAdd, 
            double hrWage, double hrsWrk)
        {
            employeeNumber = empNum;
            SetEmployeeNumber(empNum);
            employeeName = empName;
            SetEmployeeName(empName);
            employeeAddress = empAdd;
            SetEmployeeAddress(empAdd);
            hourlyWage = hrWage;
            SetHourlyWage(hrWage);
            hoursWorked = hrsWrk;
            SetHoursWorked(hrsWrk);
        }


У меня также есть метод get и set для каждого элемента данных

Что я уже пробовал:

Я пробовал искать ответы в google, но я очень неопытен, когда дело доходит до кодирования, поэтому я не уверен, что искать. Во время отладки я наблюдал значения внутри моего класса form1 и класса Employee.

1 Ответов

Рейтинг:
4

OriginalGriff

Есть несколько проблем, которые означают, что мы не можем помочь, основываясь только на этом коде: вы не показываете методы, которые вы вызываете в конструкторе (и имена подразумевают, что они должны быть свойствами, а не отдельными методами) - и очень вероятно, что это проблема, так как код, который вы показываете, влияет на ваши частные переменные.

Но...ваш метод обработчика openToolStripMenuItem_Click хранит значения в массиве, который отбрасывается в конце метода, так что все равно он тратится впустую! Единственный экземпляр Employee, к которому может получить доступ остальная часть вашего кода, - это единственный экземпляр, созданный вами в вашем form construtor:

private Employee Employee;
...
Employee = new Employee();

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

Я бы предложил пару вещей:
1) сбросьте значения EMPLOYEE_MAX и прекратите использовать массив для хранения экземпляров Employee. Вместо этого используйте список "сотрудник" и используйте его метод Add, чтобы добавить каждого сотрудника в коллекцию. Список-это как массив, но он расширяется, позволяя вам иметь там столько, сколько вы хотите.
2) сбросьте переменную Employee и сделайте ее коллекцией уровня класса-List & lt;Employee & gt; из (1) - и инициализируйте ее пустым списком:
private List<Employee> employees = new List<Employee>();
Затем, когда вы хотите посмотреть на своих сотрудников, вы можете использовать свойство Count коллекции, чтобы сказать вам, сколько их существует, и они всегда доступны классу после того, как вы их загрузили.
3) Не используйте методы Get и Set, сделайте элементы вашего сотрудника реальными свойствами:
public int EmployeeNumber {get; set;}
public string EmployeeName {get; set;}
public string EmployeeAddress {get; set;}
public double HourlyWage {get; set;}
public double HoursWorked {get; set;}
И использовать их вместо этого.