#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()
, и другие функции.