Ошибка Invalid Token при попытке доступа к переменным в классе, который будет многократно использоваться Windows Forms в C # - PullRequest
0 голосов
/ 29 марта 2019

Я новичок в C # и проработал какой-то код, в котором я могу ввести день недели для данного месяца, а затем даты (29.03.2009), которые соответствуют дню (например, пятница ) распечатаны. Я успешно получил эту работу с помощью консольного приложения.

Мне бы хотелось иметь такую ​​же функциональность при использовании форм. Я посмотрел несколько видео и провел исследование по внедрению форм, и хотя это кажется довольно простым, я хотел бы, чтобы большая часть кода работала вне кнопок в своем собственном классе, чтобы мне не приходилось вводить один и тот же код каждый раз для каждой кнопки (пример показан ниже).

Вот мой код в формах:

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

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


        public class A
        {

            public static void Main()
            {

                DateTime timenow = DateTime.Now;

                //Creates 2 strings with year and month
                string currentyearstr = DateTime.Now.Year.ToString();
                string currentmonthstr = DateTime.Now.Month.ToString();

                //Turns two strings into integers for further use
                int currentyear = int.Parse(currentyearstr);
                int selectmonth = int.Parse(currentmonthstr);

                //Outputs total days for the current month, Number of times to loop command
                var totaldaysinmonth = DateTime.DaysInMonth(currentyear, selectmonth);

                List<string> meetingdates = new List<string>();
                for (int i = 0; i < totaldaysinmonth; i++)
                {
                    DateTime dateofmonth = new DateTime(timenow.Year, timenow.Month, 1 + i);


                    Calendar mycal = CultureInfo.InvariantCulture.Calendar;
                    string dayofweek = mycal.GetDayOfWeek(dateofmonth).ToString();



                    if (dayofweek == "Friday")
                    {
                        meetingdates.Add(dateofmonth.Date.ToString("MM/dd"));

                    }







                }

    }


}




public void Form1_Load(object sender, EventArgs e)
        {

        }

        public void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.Text = A.currentyearstr;
        }
    }
}

Ожидаемый результат: я создал класс A для хранения переменных, которые я буду использовать для разных мест, таких как текстовые поля, в одном месте. Я ожидаю, что смогу найти переменную currentyearstr, например.

Я понимаю, что если я только создаю класс и не имею кода внутри Main(), то он становится доступным после объявления строки, int и других static. Проблема с этим заключается в том, что тогда if и for не работают, если они не находятся внутри Main(). В любом случае это то, что я думаю. То, что я только что описал, можно увидеть здесь:

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


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


        public static class A
        {

            static DateTime timenow = DateTime.Now;


            //Creates 2 strings with year and month
            public static string currentyearstr = DateTime.Now.Year.ToString();
            static string currentmonthstr = DateTime.Now.Month.ToString();

            //Turns two strings into integers for further use
            static int currentyear = int.Parse(currentyearstr);
            static int selectmonth = int.Parse(currentmonthstr);

            //Outputs total days for the current month, Number of times to loop command
            static var totaldaysinmonth = DateTime.DaysInMonth(currentyear, selectmonth);


            //Gives all dates in the month

            static List<string> meetingdates = new List<string>();
            static for (int i = 0; i<totaldaysinmonth; i++)
            {
                static DateTime dateofmonth = new DateTime(timenow.Year, timenow.Month, 1 + i);


            Calendar mycal = CultureInfo.InvariantCulture.Calendar;
            static string dayofweek = mycal.GetDayOfWeek(dateofmonth).ToString();



                static if (dayofweek == "Friday")
                {
                     meetingdates.Add(dateofmonth.Date.ToString("MM/dd"));   
                }


        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.Text = A.currentyearstr;
        }


    }



}


У меня есть одно сомнение: зачем мне в этом случае указывать, что все статично? когда в первом примере, когда большая часть кода находится в Main, мне нужно было сделать это только один раз. Я понимаю, что public - это то, что позволяет мне использовать переменную вне класса.

Появляются следующие ошибки:

Invalid token 'for' in class, struct, or interface member
Invalid token 'if' in class, struct, or interface member

В чем причина этих ошибок? В качестве вопроса более высокого уровня, как мне организовать код, который будет многократно использоваться, чтобы он был доступен для всех других классов? Например, в моем проекте мне нужно вызывать в этих строках разные целые числа, строки и дату и время при использовании разных форм окон.

Заранее спасибо за любую помощь. Это высоко ценится. :)

Edit:

В комментариях ниже приведен мой новый код теперь, когда я использовал метод DatesCalculated

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


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


        public class A
        {
            public void DatesCalculated(string[] args)
            {

                DateTime timenow = DateTime.Now;

                //Creates 2 strings with year and month
                string currentyearstr = DateTime.Now.Year.ToString();
                string currentmonthstr = DateTime.Now.Month.ToString();

                //Turns two strings into integers for further use
                int currentyear = int.Parse(currentyearstr);
                int selectmonth = int.Parse(currentmonthstr);

                //Outputs total days for the current month, Number of times to loop command
                var totaldaysinmonth = DateTime.DaysInMonth(currentyear, selectmonth);


                //Gives all dates in the month

                List<string> meetingdates = new List<string>();
                for (int i = 0; i < totaldaysinmonth; i++)
                {
                    DateTime dateofmonth = new DateTime(timenow.Year, timenow.Month, 1 + i);


                    Calendar mycal = CultureInfo.InvariantCulture.Calendar;
                    string dayofweek = mycal.GetDayOfWeek(dateofmonth).ToString();



                    if (dayofweek == "Friday")
                    {
                        meetingdates.Add(dateofmonth.Date.ToString("MM/dd"));
                    }
                }

                return;


            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {




        }

    }
}


1 Ответ

0 голосов
/ 29 марта 2019

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

public static class MyClass
{
    static string _thisIsAField = "hello!";
    static string ThisIsAProperty {get; set;}
    static int ThisIsAMethod(int value1, int value2)
    {
        return value1 + value2;
    }
}

Цикл for не является ни одной из этих вещей, поэтому вы не можете сделать это:

static for (int i = 0; i<totaldaysinmonth; i++)

Цикл for может существовать только внутри метода. «Неверный токен» означает, что компилятор не понимает, что он означает в том месте, куда вы его кладете. В зависимости от того, что вы пытаетесь достичь, вам придется создать метод, который что-то делает, например (это действительно неудачный пример)

static List<int> GetRangeOfNumbers(int start, int end)
{
    var list = new List<int>();
    for(var x = start; x <= end; x++)
    {
        list.Add(x);
    }
    return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...