Общение между двумя и больше формами лучше делать через события, чем проброс ссылок на форму в конструктор или что еще хуже, шарить контролы между формами. Что бы не плодить лишних событий, обычно создают класс, который будет управлять событиями. Этот класс является синглтоном. Внутри него будет какая-то коллекция, которая будет содержать инфу о подписчиков и внутри каждого элемента будет делегат. Так же внутри него будут методы - Publish, Subscribe, Unsubscribe. Subscribe и Unsubscribe нужны для подписки/отписки на событие. А вот в Publish мы передаем тему или тип события (это будет зависить от вашей реализации), находим в коллекции подписчиков с такой темой и вызываем у каждого делегат. Примеров такой реализации миллион. Например тут простая реализация -
https://codereview.stackexchange.com/questions/236070/c-event-manager-without-allocations
Возникла такая проблема, не знаю даже с чем связанна, но уже "бьюсь" с ней много времени, но так и не приходит решение на ум.
1. C# WinForms.
2. Существуют 2 формы Form1 and Form2.
3. На Form1 лежит элемент ListBox, а так же в теле есть метод с уровнем доступа Public. В котором осуществляется вывод сообщений первое на MessageBox.Show, второе на ListBox.
4. Из Form2 мы получается запускаем метод который лежит на Form1 и по логике сообщения и на MessageBox.Show и на ListBox должны отобразится.
Но по факту MessageBox.Show отображает сообщение, а ListBox не хочет.
Код:
FORM 1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows .Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void TB1()
{
MessageBox.Show("");
listBox1.Items.Add("1");
listBox1.Items.Add("2");
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
new Form2().Show();
}
}
}
FORM 2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows .Forms;
namespace WindowsFormsApp1
{
public partial class Form2 : Form
{
Form1 fm = new Form1();
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
fm.TB1();
}
}
}