Чтобы избежать проблем, хранение данных и их отображение следует разделить. Вместо создания своего собственного решения, можно использовать уже существующие подходы, такие как MVP (Model-View-Presenter), MVC (Model-View-Controller). Основная идея заключается в том, чтобы иметь отдельный объект (модель), который хранит данные, а все формы (вью), отображающие эти данные, получают их непосредственно из этого объекта. Если данные изменяются в одной форме, они автоматически обновляются в других формах (при этом следит презентер или контроллер).
Вот пара популярных решений:
1) Использование конструктора с параметром (или публичного свойства). Например, в форме 2 можно добавить конструктор, который принимает значение:
public Form2(string value)
{
Value = value;
...
}
А затем из формы 1 можно создать новый экземпляр формы 2, передавая значение:
public Form1()
{
...
}
void OpenNewForm(...)
{
var form2 = new Form2("myString");
var form2_2 = new Form2
{
Value = value
};
}
2) Использование синглтона (но при наличии DI - Dependency Injection будет лучше). Создайте объект, который будет хранить нужные переменные в одном месте, и вызывайте его в любом месте, где требуется доступ к этим переменным.