Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 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.
Чтобы вызвать метод у формы, нужно взять форму и вызвать у нее метод:
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);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Делаю импульсный(?) физический движок(2D)Для распознавания коллизий решил юзать GJK + EPA
Пытаюсь отрисовать текстуру в OpenGL, но при её рендеринге изображение почему-то поворачивается на 180 градусов и зеркально отражается по горизонталиНе...
Всем доброго времени сутокМне нужно вставить байты в поток, но дело в том, что если в потоке есть, допустим строка "123456789", то если я записываю...