Классы сотрудников и ProductionWorker, получение информации из классов

Я не совсем уверен, что название было хорошо для этого. Я застрял на школьном задании. Предполагается, что есть видео, показывающее, как это сделать, но я не могу понять, как загрузить файлы учеников с веб-сайта Пирсона. Вот проблема, над которой я работаю.

Классы сотрудника и ProductionWorker

Создайте класс Employee, имеющий свойства для следующих данных:

  • Имя сотрудника
  • Число работников

Затем создайте класс с именем ProductionWorker, производный от класса Employee. Класс ProudctionWorker должен иметь свойства для хранения следующих данных:

  • Номер сдвига (целое число, например 1, 2 или 3)
  • Почасовая оплата

Рабочий день делится на две смены: день и ночь. Свойство Shift будет содержать целочисленное значение, представляющее смену, с которой работает сотрудник. Дневная смена - смена 1, а ночная смена - смена 2.

Создайте приложение, которое создает объект класса ProductionWorker и позволяет пользователю вводить данные для каждого из свойств объекта. Получить свойства объекта и отобразить их значения.

Вот код, над которым я работаю:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace classes
{
    public partial class frmMainClasses : Form
    {
        string EmpShift = "";
        string EmployeeName = "";
        int EmployeeNumber = 0;
        float HourlyPayRate = 0;



        public class Employee
        {
            public string EmployeeName { get; set; }
            public int EmployeeNumber { get; set; }
        }

        public class ProductionWorker : Employee
        {
            public float HourlyPayRate { get; set; }
            public Shift Shift { get; set; }
        }

        public enum Shift
        {
            Day = 1,
            Night = 2
        }

        public frmMainClasses()
        {
            InitializeComponent();
        }

        private void btxExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnGetInfo_Click(object sender, EventArgs e)
        {
            string EmpShift = "";
            ProductionWorker productionWorker = new ProductionWorker();
            productionWorker.EmployeeName = txtName.ToString();
            EmployeeName = productionWorker.EmployeeName; //Added mostly because I couldn't get EmployeeName to show anything in the messagebox
            productionWorker.EmployeeNumber = Convert.ToInt32(txtIdNumb.text);
            productionWorker.HourlyPayRate = Convert.ToInt32(txtPay.text);
            EmpShift = Convert.ToString(txtShift.text);
            txtName.Text = "";
            txtIdNumb.Text = "";
            txtPay.Text = "";
            txtShift.Text = "";
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Name " + EmployeeName + "IDNumber " + EmployeeNumber + "Hourly rate " + txtPay + "Shift " + txtShift);

        }
    }

}

Сам код не показывает никаких ошибок, но когда я пытаюсь запустить его, я получаю:

Здесь есть строчка EmpShift, потому что я не мог понять, как работать с кодом сдвига, более или менее я использую его в качестве заполнителя, пока не укажу. Я понятия не имею, как решить проблему, надеюсь, это маленькая ошибка.

Благодаря помощи комментов я смог решить первую проблему, которая возникла у меня, теперь у меня проблема с окном сообщения в конце. Информация, которую я ввел в это, Блеск для имени, 12 для идентификационного номера, 1 для смены и 12 для оплаты. Вот что это показывает:

Имя System.Windows.Forms.TextBox, Текст: GlitterIDNumber 0Часовой тариф System.Windows.Forms.TextBox, Текст: Shift SystemWindowsForm.TextBox, Текст:

1 ответ

Решение

Convert.ToString не выдает ошибку, потому что один из них вызывает свою перегрузку с объектом - public static string ToString(object value), Однако, так как вы заинтересованы в вводе пользователем значения, используйте - TextBox.Text собственность вместо передачи TextBox,

Обновление 1: некоторые подробности об этом поведении

System.Convert.ToString(object value) реализован следующим образом в.net -

public static string ToString(Object value, IFormatProvider provider) {
        IConvertible ic = value as IConvertible;
        if (ic != null) 
            return ic.ToString(provider);
        IFormattable formattable = value as IFormattable;
        if (formattable != null) 
            return formattable.ToString(null, provider);
        return value == null? String.Empty: value.ToString();
    }

поэтому он заканчивает тем, что позвонил TextBox.ToString()

а также System.Convert.ToInt32(object value) как следует

   public static int ToInt32(object value) {
        return value == null? 0: ((IConvertible)value).ToInt32(null);
    }

поэтому недопустимое исключение приведения из-за этого - ((IConvertible)value).ToInt32(null)

Обновление 2: рефакторинг кода для его работы

public partial class frmMainClasses : Form
{
    //Change 1 
    //I have removed all class level string since they tend to make your code complicated & difficult to manage
    //I'll replace all of them this a single instance of ProductionWorker class, a single object is easy to manage than a bunch 

    ProductionWorker productionWorker = new ProductionWorker(); // Creating the production Worker at class level


    public class Employee
    {
        public string EmployeeName { get; set; }
        public int EmployeeNumber { get; set; }
    }

    public class ProductionWorker : Employee
    {
        public float HourlyPayRate { get; set; }
        public Shift Shift { get; set; }
    }

    public enum Shift
    {
        Day = 1,
        Night = 2
    }

    public frmMainClasses()
    {
        InitializeComponent();
    }

    private void btxExit_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnGetInfo_Click(object sender, EventArgs e)
    {
        //Change 2 : set the values of the class level variable
        productionWorker.EmployeeName = txtName.Text; //.ToString();  // Change 3 removing the .ToString();
        productionWorker.EmployeeNumber = Convert.ToInt32(txtIdNumb.Text);
        productionWorker.HourlyPayRate = Convert.ToInt32(txtPay.Text);
        productionWorker.Shift = (Shift)Enum.Parse(typeof(Shift), txtShift.Text);

        //change 4 : using .ResetText() instead of Text
        txtName.ResetText();// .Text = "";
        txtIdNumb.ResetText();//.Text = "";
        txtPay.ResetText();//.Text = "";
        txtShift.ResetText();//.Text = "";
    }

    private void btnShow_Click(object sender, EventArgs e)
    {
        // change 5 : accessing class level productionWorker instead of bunch of strings
        MessageBox.Show("Name " + productionWorker.EmployeeName + " IDNumber " + productionWorker.EmployeeNumber + " Hourly rate " + productionWorker.HourlyPayRate + " Shift " + productionWorker.Shift);

     }


}

Я добавил комментарии, чтобы подробно описать все внесенные изменения. Пожалуйста, напишите мне, если у вас есть какие-либо вопросы.

Кроме того, в данный момент ваш код не проверяет вводимые пользователем данные в текстовых полях.

Другие вопросы по тегам