Как изменить свойства форм основного GUI из стороннего класса [закрыт]

171
07 февраля 2020, 00:50
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 10 месяцев назад.

Ответом на этот вопрос бы стать пример кусочка кода (метода) вызываемого из program.main или любого другого не Form класса, который правильно получает экземпляр формы (активити) получает из него элемент (напирмер textbox) изменяет его (к примеру добавляет в форму текст) и обновляет форму.

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

Acticity ac = this.getActivity() или что то вроде того.

А Как это реализуется в C#?

Отвечаю на свой вопрос.

используя new будете получать ВСЕГДА доступ к новому (классу\форме\чему нибудь). Халява типа fm.richTextBox1.Text = "error"; не пройдет. к примеру, если у вас есть какой то класс, в нем есть какой то метод который что то считает и вы этим самим методом хотите обратиться к какой нибудь форме (например Form1) и записать результат в текст бокс то сделать это можно так: 1)не очень правильно:

Form1 frm = ((Form1)Application.OpenForms["Form1"]);
frm.text1.Text = что то;

либо так - ((Form1)Application.OpenForms["Form1"]).text1.Text = что то;

2)правильно:

public T GetForm<T>() where T : Form
        {
            return (T)Application.OpenForms[typeof(T).Name];
        }
var frm = GetForm<Form1>();
frm.text1.Text = что то;

модификаторы доступа у контролов формы должны быть в public.

Answer 1

Чтобы вызвать метод у формы, нужно взять форму и вызвать у нее метод:

var form = new MainForm();
// ...
form.TextLabel2("Hello, world!");
// ...
Application.Run(form);

Не забудьте убедиться, что вы вызываете метод у той же самой формы, которую вы передали в Application.Run.

И да, создание формы и вызов Application.Run(form) - это не нечто что нужно делать каждый раз при обращении к форме, а то что должно быть сделано ровно 1 раз, в методе Main.

Также обращайте внимание на поток исполнения: при обращении к форме из другого потока следует использовать Invoke:

form.Invoke((Action)() => {
    form.TextLabel2("Hello, world!");
});

Ещё лучше использовать контекст синхронизации (в частности, не будет проблем с обращением к форме после закрытия формы) - если не запутаетесь в этих контекстах.

var form = new MainForm();
var uictx = SynchronizationContext.Current; // Обязательно вызывать после создания формы и строго в UI-потоке
// ...
uictx.Post(_ => form.TextLabel2("Hello, world!"), null);
READ ALSO
Как получить точки контакта из EPA

Как получить точки контакта из EPA

Делаю импульсный(?) физический движок(2D)Для распознавания коллизий решил юзать GJK + EPA

188
При загрузке Bitmap в OpenGL изображение отражается и поворачивается

При загрузке Bitmap в OpenGL изображение отражается и поворачивается

Пытаюсь отрисовать текстуру в OpenGL, но при её рендеринге изображение почему-то поворачивается на 180 градусов и зеркально отражается по горизонталиНе...

168
Вставить байты в FileStream C#

Вставить байты в FileStream C#

Всем доброго времени сутокМне нужно вставить байты в поток, но дело в том, что если в потоке есть, допустим строка "123456789", то если я записываю...

181