То, как я делал это в прошлом, - это передача делегата Action во вторую форму, которая ссылается на метод из первой формы.
Метод, который вы передаете, содержит логику, которая обновляет ваш DataGridView.
Затем во втором событии закрытия формы вы вызываете этого делегата (после проверки, что он не нулевой), передавая значение из вашего текстового поля.
Ниже приведен краткий прототип кода, демонстрирующий, как это сделать. Мой метод из Form1 просто показывает окно сообщения, но вы можете легко изменить его, чтобы обновить свой источник данных DataGridView.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
Action<string> showMessage = ShowMessage;
form.ClosingMethod(showMessage);
form.Show();
}
private void ShowMessage(string message)
{
MessageBox.Show(message);
}
}
public partial class Form2 : Form
{
private Action<string> _showMessage;
public Form2()
{
InitializeComponent();
}
public void ClosingMethod(Action<string> showMessage)
{
_showMessage = showMessage;
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (_showMessage != null)
{
_showMessage("hippo");
}
}
}
Редактировать
Мне только что пришло в голову, что звонок делегату _showMessage("hippo");
блокируется.
Ваша форма не закроется до тех пор, пока делегат не завершит работу - возможно, надолго. В моем примере окна сообщения форма не закрывается до тех пор, пока не будет нажата кнопка ОК.
Чтобы обойти это, вы можете вызвать своего делегата асинхронно, как показано ниже:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (_showMessage != null)
{
_showMessage.BeginInvoke("hippo", null, null);
}
}