Вы создаете новый экземпляр Form1 и добавляете элемент в его список, а не получаете экземпляр Form1, который у вас, без сомнения, уже есть, и вызываете метод для этого.
Наивный подход - иметь параметр в конструкторе Form2, который принимает экземпляр Form1 и сохраняет его в качестве переменной экземпляра для использования в этом обработчике событий.
Мне не очень нравится такой подход с точки зрения дизайна.
Я бы предложил создать публичное событие в Form2, чтобы Form1 подписалась на это событие и добавила обработчик, который добавляет элемент в список. Событие в Form2 будет выглядеть примерно так:
public event EventHandler ButtonClick
{
add
{
button1.Click += value;
}
remove
{
button1.Click += value;
}
}
Тогда у вас будет свойство, которое выглядит примерно так:
public string SomeValueForm1NeedsOnButtonClick
{
get
{
return texbox1.Text;
}
}
Тогда в Form1 у вас будет что-то вроде:
Form2 otherForm = new Form2();
otherForm.ButtonClick += (sender, args) =>
{
listbox1.Items.Add(otherForm.SomeValueForm1NeedsOnButtonClick);
};
Этот подход гарантирует, что каждая форма знает как можно меньше о каждой другой форме. Это уменьшает сцепление между двумя классами и делает более понятными для будущих пользователей / читателей форм, что именно происходит между ними.