Изменить текст метки в Static void C # - PullRequest
1 голос
/ 12 марта 2011

Я хочу изменить текст метки на одной форме на текст кнопки на другой форме, когда я нажимаю кнопку.

Для этого я создал это в форме, где метка

public static void changeText(string text)
{
     L1.text = text;
}

этот код находится на бланке с кнопкой

mainForm.changeText(this.Text);

Затем выдается ошибка: Ссылка на объект требуется для нестатического поля, метода или свойства ...

Это может показаться глупым вопросом, но я все еще плохо знаком с C #, поэтому, пожалуйста, помогите мне.

Ответы [ 4 ]

4 голосов
/ 12 марта 2011

О статических и нестатических элементах

Существует два типа членов типа: нестатический и статический. Нестатические члены также называются членами экземпляра, поскольку они появляются в экземплярах объекта типа. Статические члены привязаны к самому типу, а не к его экземплярам объекта, поэтому вы можете использовать их без фактического создания экземпляра типа.

Рассмотрим следующее:

class MyClass
{
      // static member: can NOT reference 'this', as it is not in the context of an object instance of the type
      public static bool IsTrue()
      {
           return true;
      }

      // constructor: this runs whenever the type is instantiated
      public MyClass()
      {

      }

      // instance member: can access to 'this', which references the context object instance of the type
      public int GetNumber()
      {
           return 42;
      }
}

Вы можете использовать вышеуказанный тип следующим образом:

if(MyClass.IsTrue()) // static call
{
    var myObject = new MyClass(); // constructor call
    int result = myObject.GetNumber(); // instance member call
    Console.WriteLine(result);
}

К вашей конкретной проблеме ...

Если вы абсолютно уверены, что вам нужна эта логика внутри статического метода, вам нужно получить экземпляр объекта формы, которую вы хотите изменить. К сожалению, синглтоны работают не очень хорошо, потому что дизайнеру VS нужно создать экземпляр объекта вашей формы, который явно нарушает шаблон синглтона.

То, что вы все еще можете использовать, (в случае приложения Windows Forms): Application.OpenForms . Это возвращает доступную только для чтения коллекцию, которая содержит все открытые в данный момент формы приложения. Вы можете использовать это, чтобы найти экземпляр объекта формы, которую вы хотите изменить, и затем выполнить это изменение.

Имейте в виду, что если это многопоточная ситуация (т. Е. Статический метод выполняется в потоке, отличном от потока GUI), вам придется использовать какой-либо механизм синхронизации, например InvokeRequired и Invoke () .

2 голосов
/ 12 марта 2011

L1 не является статическим, поэтому вы не можете иметь статическую функцию, взаимодействующую с ним. Наличие статики позволяет вам писать что-то вроде MainForm.changeText(...), но что в этом случае означает L1? Я думаю, что мы можем сказать:

  1. Вам не нужна функция для изменения текста метки, свойство Text уже записано
  2. Если есть какая-то логика, необходимая для того, чтобы переделать тету, прежде чем вы сможете:

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

2 голосов
/ 12 марта 2011

Вы не хотите использовать статический метод для этого, так как L1 является членом класса mainForm.

0 голосов
/ 12 марта 2011

Ошибка означает, что ваша статическая функция обращается к нестатической переменной (элемент управления L1).

Статические функции могут обращаться только к статическим переменным.Вы можете изменить L1 на статическую переменную, чтобы она работала.

...