1

Тема: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Будь ласка, допоможіть розібратися з проблемою у Windows Forms. У мене є консольний додаток на C#, який за датою народження людини обчислює її точний вік. У програмі є клас "Age_organizer" з багатьма статичними полями та двома статичними методами. Кожне статичне поле — це кількість людей певного віку (немовлята, 1 рік, 2 роки ..., 25 років тощо). Перший метод робить розрахунки, другий — відображає результати у консолі. Програма працює коректно і справляється з покладеними на неї завданнями. Але виникла необхідність зробити подібну програму на Windows Forms, на чому я не дуже розуміюся. Форма (дизайн якої створений не мною) містить багато TextBoxes, в кожен з яких при старті програми повинні бути записані дані з відповідних статичних полів класу "Age_organizer", але я не можу реалізувати це.

Що я зробив? Я переніс свої класи та методи до "Program.cs" форми (може не треба було?). Потім у Form1.cs для для першого з TextBoxes прописав наступне:

private void Form1_Load(object sender, EventArgs e)
        {
            TextBox1.Text = (Age_Organizer.infants)ToString();
        }

Що я отримав? Помилку CS0426. Ім'я типу "infants" не існує в типі "Age_Organizer". Ця помилка, зазвичай, виникає, якщо допущена помилка під час вводу символів. Але помлки немає, тому що я вводив лише назву класу, а коли поставив крапку, Visual Studio сама запропонувала мені вибрати необхідне поле зі списку. Тобто, спочатку вона (IDE) це поле бачить, а потім не бачить. Спочатку я подумав, що помилка виникає через те, що потрібно обчислення, можливо, не були завершені в потрібний момент часу, бо я, можливо, щось наплутав у класі з головним методом. Але чому тоді в TextBox не відображається хоча б «0» (початкове значення для кожного поля класу)? Усі створені мною поля та методи є публічними.
Як ви мабуть зрозуміли, я початківець в програмуванні, і це не є моєю основною професією. Тому часу для вивчення нової інформації дуже мало. Я намогався знайти відповіді на подібні запитання в інших джерелах. Більщість з них радить все переписувати і відмовлятись від статичних полів та методів (мовляв це моветон), а замість цього створювати об'єкти. Але у тих випадках йдеться про тисячі значень, а мені треба лише відобразити близько сотні значень полів. Консольний варіант працює чудово і мені не дуже хочеться, щось сильно у ньому змінювати. Якщо хтось порадить простий спосіб передати значення статичного поля до TextBox, я буду надзвичайно вдячний.

2

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Вітаю на форумі. Для початку: всі підказки в редакторі IDE - лише підказки. Чітку відповідь, є помилка чи ні, може дати тільки компілятор. А те, що щось підставилося чи підкреслилося - це не дуже важливо, хоча може допомогти вам писати код.
Зазвичай бажано наводити не тільки той фрагмент коду, де показана помилка, а й інший код - хоча б настільки, щоб цю помилку можна було відтворити.
Але тут все досить чітко виписано. Age_Organizer - це ТИП. Як String, int і т.д. Конструкція (тип)щось означає перетворення щось до типу тип. От компілятор і вирішив, що ви хочете перетворити результат виклику функції ToString() на Age_Organizer.infants, але infants - швидше за все не тип, а поле класу, правильно ж? Тому й така помилка.
А от як її виправити - це вже без решти коду не скажеш. Мабуть, у вас десь є змінна типу Age_Organizer. І вам треба зробити щось на кшталт

назва_змінної.infants.ToString();
Подякували: dr.Roman1

3

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

koala написав:

Age_Organizer - це ТИП. Як String, int і т.д. Конструкція (тип)щось означає перетворення щось до типу тип. От компілятор і вирішив, що ви хочете перетворити результат виклику функції ToString() на Age_Organizer.infants, але infants - швидше за все не тип, а поле класу, правильно ж?

Дякую за швидку відповідь. Так, infants це дійсно поле класу. Поле класу Age_Organizer, і воно має тип int. Змінні у даному класі лише локалні, інших немає.

4

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Допис koala наштовхнув мене на думку, що варто прибрати ToString() і написати просто: 

private void Form1_Load(object sender, EventArgs e)
        {

            TextBox1.Text = Age_Organizer.infants_r + "";

        }

І це дало результат. Помилка зникла, і у формі стало відібражатися початкове значення поля, тобто 0. Але тепер виходить, що форма показує текст до того, як завершаться розрахунки (або вони взагалі не проводяться). Ось скорочена версія головноно методу. Підкажіть, що треба виправити:

class Program
{
    static void Main(string[] args)
    {
        //Application.EnableVisualStyles();
        //Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new Form1());
        // The commented lines are relevant only for the WinForms version. Perhaps it was necessary to add my code to the form differently?
        int count = 0, gender = 0, sity;
        Regex regex = new Regex(@"\d{2}\D\d{2}\D\d{4}");
        Regex regex_2 = new Regex(@"female");
        string sourceDirectory = @"F:\Direction"; 
        foreach (var txtFiles in Directory.EnumerateFiles(sourceDirectory, "*.html"))
        {
            Some_Parser_Work(); // Тут починає свою работу парсер. Насправді немає окремого методу для цього, парсер описаний в головному методі.
            Age_Organizer.AgeOrg(years, months, days, gender, sity); // years, months, days - локальні зміннні
            break;    
        }
            count = 0;
        Age_Organizer.AgeShow(); // Not used in WinForms version.
        Console.ReadKey(); // Not used in WinForms version.
    }
}

5

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Визначення Age_Organizer дайте, будь ласка.

Подякували: dr.Roman1

6

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

koala написав:

Визначення Age_Organizer дайте, будь ласка.

В самому класі Age_Organizer немає нічого особливого. Метод AgeOrg викликається з головного методу для кожного файлу в директорії, і йому з головного методу передаються зміннні, отримані під час парсингу, на підставі яких він кожен раз змініє відповідні поля в класі. Потів в головному методі викликається метод AgeShow, який просто відображає данні полів класу. Але це у консольному варіанті. А у WinForms метод AgeShow не використовується, а треба якось вивести значення полів в відповідні TexBxes. Але виводяться тільки їх початкові значення. Мені здається, що після строки Application.Run(new Form1());, код або належним чином не виконується, або у TexBoxes форми заповнюються нулями раніше, аніж він виконається. Ось клас AgeOrg:

public class Age_Organizer 
{
    public static int man_r = 0, woman_r = 0, sity_1 = 0;
    public static int age0_5_r = 0, age0_5_r_f = 0;
    public static int infants_r = 0, kids_r = 0, teenagers_r = 0, tenage_workers_r = 0, adult_workers_r = 0, adult_pensioners_p = 0;
    public static int infants_r_f = 0, kids_r_f = 0, teenagers_r_f = 0, tenage_workers_r_f = 0, adult_workers_r_f = 0, adult_pensioners_p_f = 0;
    public static int m0_r = 0, m1_r = 0, m2_r = 0, m3_r = 0;
    public static int m0_r_f = 0, m1_r_f = 0, m2_r_f = 0, m3_r_f = 0;
    // Насправді полів набагато більше, але суті це не змінює.
    public static void AgeOrg(int years, int months, int days, int gender, int sity)
    {
        if (sity == 1)
        {
            sity_1++;
            if (gender == 1)
            {
                woman_r++;
                if (years < 1)
                {
                    infants_r_f++;
                    age0_5_r_f++;
                    if (months == 0)
                        m0_r_f++;
                    if (months == 1)
                        m1_r_f++;
                    if (months == 2)
                        m2_r_f++;
                    if (months == 3)
                        m3_r_f++;
                }
                if (gender == 2)
                {
                    man_r++;
                    if (years < 1)
                    {
                        infants_r++;
                        age0_5_r++;
                        if (months == 0)
                            m0_r++;
                        if (months == 1)
                            m1_r++;
                        if (months == 2)
                            m2_r++;
                        if (months == 3)
                            m3_r++;
                    }

                }
            }
        }
    }
    public static void AgeShow() // This method is described exclusively for the console version.
    {
        Console.WriteLine("Statistics for City 1 (" + (woman_r + man_r) + " served inhabitants - " ):\n");
        Console.WriteLine("Age groups: \t\t0-5");
        Console.WriteLine("Female gender:  \t{0}", age0_5_r_f);
        Console.WriteLine("Male gender: \t{0}", age0_5_r);
        Console.WriteLine("\nChildren:\tinfants (0 years)   Kids (0-14)   Teenagers (15-17)   tenage_workers (16-17)   Total ()");
        Console.WriteLine("Female gender::  \t\t{0}\t\t{1}\t\t{2}\t\t\t{3}\t\t\t{4}", (infants_r_f + kids_r_f), teenagers_r_f, tenage_workers_r_f, (infants_r_f + kids_r_f + teenagers_r_f));
        Console.WriteLine("Male gender: \t\t{0}\t\t{1}\t\t{2}\t\t\t{3}\t\t\t{4}\n", (infants_r + kids_r), teenagers_r, tenage_workers_r, (infants_r + kids_r + teenagers_r));
    }
}

7 Востаннє редагувалося koala (17.12.2022 20:13:38)

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Вам треба повністю переробити AgeOrg.
Просто зверну увагу на це місце:

if (gender == 1)
{
    A();
    if (gender == 2)
    {
        B();
    }
}

код B() не буде виконано ніколи. Треба пояснювати, чому?

Подякували: dr.Roman1

8

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Просто зверну увагу на це місце:

if (gender == 1)
{
    A();
    if (gender == 2)
    {
        B();
    }
}

код B() не буде виконано ніколи. Треба пояснювати, чому?

Це просто неправильне відображення форматування. Можливо я щось не так скопіював і вставив.
Насправді:

if (gender == 1)
{
    A();
}
if (gender == 2)
{
    B();
}

Як я вже казав, консольний додаток працює без проблем, весь код виконується, але я не розумію де треба вставити мій код у WinForms, щоб він виконувався відразу після запуску програми і короктно виводив результати розрахунків в TextBoxes.

9

Re: Відобразити дані статичного поля певного класу у TexstBox WinForms?

Я розібрався. Проблема була в банальному нерозумінні принципів роботи WinForms. Строку Application.Run(new Form1()); треба прописувати в кінці головного методу. Тоді спочатку проводяться розрахунки, а потім відображається форма з коректно заповненими TextBoxes. Результати повністю співпадають з результатом роботи консольного додатку. Хоча, по суті, я сам до цього дійшов, дякую koala за увагу до мого питання.