Ссылка на объект CS0120 требуется для нестатического поля, метода или свойства

#c# #forms #visual-studio

#c# #формы #visual-studio

Вопрос:

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

Form1.cs

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

namespace GradeCalculation
{
    public partial class GradeCalculation : Form
    {
        public GradeCalculation()
        {
            InitializeComponent();
        }

    private void StudentGrade_KeyPress(object sender, KeyPressEventArgs e)
    {
        //allows a decimal point to be added
        var regex = new Regex(@"[^.s]");

        //only allows numbers and backspace along with the decmial
        if ((!char.IsNumber(e.KeyChar)) amp;amp; (!char.IsControl(e.KeyChar)) amp;amp; regex.IsMatch(e.KeyChar.ToString()))
        {
            e.Handled = true;
        }
    }

    private void PaperPrecentage_KeyPress(object sender, KeyPressEventArgs e)
    {
        //onlys allows numbers and backspace
        if ((!char.IsNumber(e.KeyChar)) amp;amp; (!char.IsControl(e.KeyChar)))
        {
            e.Handled = true;
        }
    }

    public void GradeButton_Click(object sender, EventArgs e)
    {
        try
        {
            //creating the object GradeWorkOut which calls on GradeWorkingOut class
            GradeWorkingOut GradeWorkOut = new GradeWorkingOut();
            GradeWorkOut.Grading();
        }
        catch (Exception)
        {
            MessageBox.Show ("It's not communicating with GradeWorkingOut");
        }
    }

    public void GradesWorkOut()
    {
        GradeWorkingOut.StudentGradeInput = float.Parse(StudentGrade.Text);
    }
}
  

Ошибка GradeWorkingOut.cs
строка 22 этого файла

     namespace GradeCalculation
{
    class GradeWorkingOut : Form
    {
        public static float StudentGradeInput { get; internal set; }
        public static float StudentPaperInput { get; internal set; }
        public static float Rounding { get; internal set; }
        public static String PaperMark { get; internal set; }
    public void Grading()
    {         
        try
        {
            //Gets the inputted student grade and then converts it from text to a float
            StudentGradeInput = GradeCalculation.GradesWorkOut();
            //Gets the inputted percentage of the paper/assignment and then converts it from text to a float
            StudentPaperInput = float.Parse(PaperPrecentage.Text);
            //This rounds the float to two decimal places 
            Rounding = (float)Math.Round(StudentGradeInput * StudentPaperInput / 100, 2);
            //Outputs the final grade so they know the overall percentage for the paper/assignment            
            OverallGrade.Text = PaperMark = Convert.ToString(Rounding);
            
            //calls the method which contains the alphabetical grade of the user
            AlphabetGrades();
        }
        catch (Exception)
        {
            MessageBox.Show("Please enter a value");
        }

            
        return;
        
    }
    //Contains the Alphabetical Grades in realtion to the percentage the user has
    public void AlphabetGrades()
    {
        try
        {
            String Grade = "";

            switch (Grade)
            {
                case "A ":
                    if (Rounding >= 90)
                    {
                        Grade = "A ";
                    }
                    break;

                case "A":
                    if (Rounding >= 85)
                    {
                        Grade = "A";
                    }
                    break;

                case "A-":
                    if (Rounding >= 80)
                    {
                        Grade = "A-";
                    }
                    break;

                case "B ":
                    if (Rounding >= 75)
                    {
                        Grade = "B ";
                    }
                    break;

                case "B":
                    if (Rounding >= 70)
                    {
                        Grade = "B";
                    }
                    break;

                case "B-":
                    if (Rounding >= 65)
                    {
                        Grade = "B-";
                    }
                    break;

                case "C ":
                    if (Rounding >= 60)
                    {
                        Grade = "C ";
                    }
                    break;

                case "C":
                    if (Rounding >= 55)
                    {
                        Grade = "C";
                    }
                    break;

                case "C-":
                    if (Rounding >= 50)
                    {
                        Grade = "C-";
                    }
                    break;


                case "D":
                    if (Rounding >= 40)
                    {
                        Grade = "D";
                    }
                    break;

                case "F":
                    if (Rounding >= 0)
                    {
                        Grade = "F";
                    }
                    break;
            }
        }
        catch (Exception)
        {

            MessageBox.Show("Unable to show what you grade is in Alphabet form"); ;
        }
    }
}
  

Комментарии:

1. Я добавил строку ошибки

2. Это также может быть полезно для вас : public string GetGradeFromScore(double score) => "A ,A,A-,B ,B,B-,C ,C,C-,D,D".Split(',').Reverse().Where((grade, index) => 40 5 * index <= score).LastOrDefault() ?? "F"; .

Ответ №1:

Ссылка на объект требуется для нестатического поля, метода или свойства

Это происходит потому, что вы вызвали свой класс напрямую, а не через ссылку, но вы не можете этого сделать. Вам нужно будет сначала создать новый экземпляр GradeWorkingOut или использовать ссылку, созданную вами GradeButton_Click() , или передать ссылку в качестве аргумента функции.

Примеры:

 //******************************************************************
// Pass as a Function argument
//******************************************************************
public void GradesWorkOut(GradeWorkingOut GradeWorkOut) {
    GradeWorkOut.StudentGradeInput = float.Parse(StudentGrade.Text);
}

//******************************************************************
// Use a global reference
//******************************************************************
GradeWorkingOut GradeWorkOut = new GradeWorkingOut();

public void GradesWorkOut() {
    GradeWorkOut.StudentGradeInput = float.Parse(StudentGrade.Text);
}

//******************************************************************
// Create a new Reference
//******************************************************************
public void GradesWorkOut() {
    GradeWorkingOut GradeWorkOut = new GradeWorkingOut();
    GradeWorkOut.StudentGradeInput = float.Parse(StudentGrade.Text);
}
  

Обязательно используйте ту же ссылку, которую вы вызывали .Grading() , и другие функции.