Изменение метки в form1 из другого файла класса - PullRequest
0 голосов
/ 05 марта 2020

Я написал C# программу, которая полностью работает в Form1 и прекрасно работает. Программа крошечная, с ограниченными функциональными возможностями, но я хочу создавать более крупные программы и делать вещи более организованными. Пока другие классы не взаимодействуют с пользовательским интерфейсом, все работает нормально. Но вещи go не так, когда я пытаюсь изменить что-то на GUI из другого класса.

После дня поисков и попыток я застрял.

Я создал крошечную тестовую программу с одной меткой, и это прекрасно работает:

using System;
using System.Windows.Forms;

namespace testapp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Changelabel1();           
        }
        public void Changelabel1()
        {
            label1.Text = "changedlabel1";
        }
    }
}

Это поменяет label1 для отображения «changelabel1». Отлично. Теперь я создал файл класса 1, добавил label2 и изменил форму Form1: Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Changelabel1();
    }
    public void Changelabel1()
    {
        label1.Text = "changedlabel1";
    }
    public string ChangeLabel2
    {
        get
        {
            return label2.Text;
        }
        set
        {
            label2.Text = value;
        }
    }
}

и создал Class1.cs:

class Class1
{
    Form1 _mainForm;
    public Class1(Form1 form)
    {
        _mainForm = form;
    }
    public void ChangeLabelText()
    {
        _mainForm.ChangeLabel2 = "ChangedTheTextBox2";
    }
}

Первая проблема заключается в том, что я не могу Кажется, доступ к Class1.ChangeLabelText () из формы Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Changelabel1();
        Class1.ChangeLabelText(); //This doesn't work

    }

В ответ я получаю ошибку ссылки на объект. Я могу получить Class1.ChangeLabelText (), если я изменю publi c void ChangeLabelText () на publi c stati c void ChangeLabelText () в Class1, но тогда _mainform.ChangeLabel2 дает исключение ссылки на объект.

Что я здесь не так делаю?

С уважением,

1 Ответ

2 голосов
/ 05 марта 2020

Class1.ChangeLabelText (); // Это не работает

Вы вызываете метод, как если бы он был static (имеется в виду => ClassName.MethodName()). Но это не так! Вот почему это не работает. Вам нужен экземпляр типа Class1

public partial class Form1 : Form
{
    Class1 instanceOfClass1;

    public Form1()
    {
        InitializeComponent();
        Changelabel1();
        instanceOfClass1 = new Class1(this)  // create instance first
        instanceOfClass1.ChangeLabelText(); //  This should work
    } 

Я могу добраться до Class1.ChangeLabelText (), если я изменю publi c void ChangeLabelText () на publi c stati c void ChangeLabelText () в Class1, но затем _mainform.ChangeLabel2 выдает исключение ссылки на объект.

Вам не разрешен доступ к членам класса в методе stati c. Метод stati c не зависит от экземпляра, но член класса задается экземпляром c! Это означает, что каждый экземпляр будет иметь свой собственный экземпляр переменной класса. Вот почему простой метод static не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...