Как реализовать окно регистрации в C #? - PullRequest
0 голосов
/ 27 апреля 2019

Итак, используя конструктор форм Windows, я создал новую форму с текстовым полем в ней, назвав эту форму как LogForm.cs, эта форма / класс имеет метод с именем log (строковый текст).

В моем основном классе формы (Form1.cs) я создал экземпляр этой формы.

LogForm logForm = new LogForm();
logForm.log("Logger has started...");

и это хорошо отображается в текстовом поле LogForm. Но когда я вызываю logForm.log("Some logging info...") для моего кода внутри потока, это как-то приводит к сбою приложения.

Как мне справиться с этим? Пожалуйста, помогите мне продемонстрировать небольшой код. Я довольно новичок в C # и программировании в целом, поэтому я надеюсь, что вы подумаете.

1 Ответ

0 голосов
/ 27 апреля 2019

Используйте / вызывайте эту функцию в LogForm.log (кстати, методы в C # обычно пишутся с большой буквы).

private void SetText(string text)
{
    Action set = () => yourTextBox.Text = text;

    if (yourTextBox.InvokeRequired)
    {
        yourTextBox.Invoke(set);
    }
    else
    {
        set.Invoke();
    }
}

Если это невозможно установить из текущего потока, yourTextBox.InvokeRequired будет истинным, и функция сработает. В противном случае он просто устанавливает его напрямую.

Вдохновение от этот ответ на возможный дубликат .

Поскольку вы говорите, что проблема сохраняется, я покажу немного больше кода и попытаюсь объяснить его дальше.

Прежде всего, я отредактировал метод SetText. Я добавил модификатор private, поскольку эта функция не имеет отступа для вызова вне LogForm. Я также добавил фигурные скобки, так как это мой предпочтительный стиль, и он также гарантирует, что оператор if ведет себя как ожидалось.

public void Log(string message) {
    SetText(message);
    //do stuff
}

Оба эти метода (Log и SetText) находятся внутри класса LogForm. Теперь вы можете вызывать logForm.Log("Logger has started..."); из любого потока, если ваша форма (содержащая текстовое поле) уже инициализирована. Обычно это происходит в конструкторе, вызывая InitializeComponent(); в первой строке.

Не зная больше о вашем коде, это, вероятно, насколько я могу вам помочь.

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