Передача переменной из другого класса в форму - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь передать переменную (строку) в C # для особой задачи:

Обзор:

Я пишу плагин для купленной программыв моей компании.Программа (или лучше: поддержка программ) предоставляет пользователю базовый C # -код, который в основном просто открывает форму, и связывает программу с тем, что я записываю в коде форм.Так как это Visual-Studio-Solution, я получаю несколько файлов: «MyUserInterface.cs» и «MyUserInterface.Designer.cs».

«MyUserInterface.Designer.cs» определяет внешний вид моей формы, то естьНаиболее важные части для моей проблемы:

partial class MyUserInterface
{   
    [...]     
    private void InitializeComponent()
    {
        [...]
        this.f_status = new System.Windows.Forms.Label();
        this.SuspendLayout();
        [...]
        // 
        // status
        // 
        this.f_status.Name = "status";
        this.f_status.Text = "WELCOME TO MYPLUGIN v2";
        [...]
        this.Controls.Add(this.f_status);
        this.ResumeLayout(false);
        this.PerformLayout();
    }

    [...]
    private System.Windows.Forms.Label f_status;
    [...]
}

Самый важный код из "MyUserInterface.cs":

partial class MyUserInterface
{
    [...]
    public MyUserInterface()
    {
        InitializeComponent();
    }
    [...]
    private void click_compute(object sender, EventArgs e)
    {
        //Basically everythings runs here!
        //The code is opend in other classes and other files
    }
}

Теперь, как я отметил в разделе кода, все моекод выполняется в функции "click-compute" и "передается" другим классам.

Одна важная часть моего кода находится в "statushandler.cs":

class statushandler
{
    [...]
    public static void status_msg(string c_msg)
    {
        [...]
        f_status.Text = c_msg; // And here is my problem!!
        [...]
    }
}

Проблема:

В моем особом случае я пытаюсь изменить текст метки "f_status" при запуске моего кода с помощью функции "status_msg"!

ПокаЯ передаю переменные между классами несколько раз в моем коде.A не может понять, почему этот явный не может быть найден внутри "statushandler".(Это не проблема, пока я остаюсь внутри исходного "click_compute", не переходя в другой класс).

То, что я уже пробовал:

1.) Я попытался изменить практически все в "MyUserInterface" на "public",

2.) Также я попытался вызвать f_status в status_msg, например MyUserInterface.f_status.Text,

3.) ЗаписатьФункция получения / установки в «MyUserInterface. (Designer.) CS» (оба), что было катастрофическим, потому что я больше не мог определять метку в InitializeComponent.

4.)

a.) Прочтите множество Stackoverflow-Threads о передаче переменных между классами, что не помогло, все решения, которые я нашел, работают между классами, но не в этом особом случае.

b.) Посмотрел много учебных пособий youTube, тот же результат.

c.) Прочитал некоторые сообщения от stackoverflow о передаче переменных между различными формами, но у них всех было общее, что "display-form "был открыт после того, как переменная была известна.В моем особом случае форма все время открывается, ее нельзя ни закрыть, ни открыть ...

И теперь у меня нет идей!Я не удивлюсь, если я не увижу некоторые детали, но я не смогу их найти ... Я был бы очень рад, если бы кто-нибудь мог мне помочь!

Мой вопрос:

Как я могу изменить текст моей этикетки из другого класса?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

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

public static void status_msg(MyUserInterface form, string c_msg)
{
    [...]
    form.f_status.Text = c_msg; // And here is my problem!!
    [...]
}

Если у вас есть форма одного экземпляра (создается только один экземпляр за раз), вы можете иметь статическое свойство с его ссылкой:

partial class MyUserInterface
{
    public static MyUserInterface Instance { get; private set; }
    [...]
    public MyUserInterface()
    {
        InitializeComponent();
        Instance = this;
    }
}

С этим решением вы можете использовать свой старый метод:

class statushandler
{
    [...]
    public static void status_msg(string c_msg)
    {
        [...]
        MyUserInterface.Instance.f_status.Text = c_msg; // You have instance of yout form here
        [...]
    }
}

Конечно, вы должны защищать от нулевой / удаленной формы и т. Д.

0 голосов
/ 10 декабря 2018

Создайте открытое свойство для определенного класса в вашей 1-й форме, которое получает значение метки следующим образом:

public string Name {get {return Label1.Text}; set {Label1.Text = value}; }

Затем в вашей 2-й форме:

public Form2(Form1 form)
{
    string name;
    name = form.Name;
}
...