вызов ярлыка из другого класса в c # winform - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я обновляю форму с этим кодом в пределах public partial class Form1 : Form

this.Invoke((MethodInvoker)delegate
{
    Intellisale_Lastprocessed_Item_Label.Text = "example"
}

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

Поэтому я построил класс "UiUpdate".
к сожалению, из этого класса я получаю сообщение: «Форма 1 не содержит определения Intellisale_Lastprocessed_Item_Label»

enter image description here

Возможно, я упустил что-то действительно простое, но пока не нашел ответа.

EDIT:

Из-за предложений я изменил свой код на следующий:

class UiUpdate
{
    public void UpdateIntellisale(Form1 form)
    {
        form.Intellisale_Lastprocessed_Item_Label.text = "example";
    }
}

к сожалению, я все еще получаю сообщение, что определение ярлыка недоступно

Обновление 2:

, как уже упоминалось, метки были определены как частные в конструкторе

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вам необходимо передать объект класса Form1 в метод UpdateIntellisale. Как:

class UiUpdate {
    public void UpdateIntellisale(Form1 form) {
        form.Intellisale_Lastprocessed_Item_Label.text = "test";
    }
}

И назовите это как: UpdateIntellisale(this) (конечно, только если this относится к Form1 классу)

0 голосов
/ 07 мая 2018

Есть несколько вопросов: 1. Вы обращаетесь к своей метке, как если бы она была определена как статический член Form1. Вместо этого используйте имя экземпляра. e.g.:

Form1 form = new Form1();
form.Intellisale_Lastprocessed_Item_Label.Text = "example" 
// Be aware of an InvalidOperationException with the message, "Control control name accessed from a thread other than the thread it was created on." that is throw if you use this code.

см .: https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls

  1. Обычно метки определяются как личные в файле конструктора. Самый простой способ - объявить их общедоступными, но нехорошо обращаться к полю непосредственно из какого-либо другого класса. Вместо этого используйте свойство.
0 голосов
/ 07 мая 2018

Вы делаете static ссылку на Form1 класс , а не на конкретный экземпляр этого класса. Передайте экземпляр, который вам нужен, вашему методу:

public void UpdateIntellisale(Form1 form)
{
    form.Intellisale_Lastprocessed_Item_Label.Text = "test";
    // etc...
}

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

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