This is easy using an event. In the following example, MainForm is the startup form and ChildForm will pass an array to MainForm.
MainForm
namespace SendToMainForm
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void OpenChildFormButton_Click(object sender, EventArgs e)
{
ChildForm childForm = new() { Owner = this };
childForm.PassMonths += ChildFormOnPassMonths;
childForm.Show(this);
childForm.Top = Top;
childForm.Left = Left + Width + 10;
}
private void ChildFormOnPassMonths(string[] months)
{
listBox1.Items.AddRange(months);
}
}
}
ChildForm
namespace SendToMainForm
{
public partial class ChildForm : Form
{
public delegate void OnPassMonths(string[] monthNames);
public event OnPassMonths PassMonths;
public ChildForm()
{
InitializeComponent();
}
private void SendDataToMainFormButton_Click(object sender, EventArgs e)
{
var months = System.Globalization
.DateTimeFormatInfo.CurrentInfo
.MonthNames.Take(12).ToArray();
PassMonths?.Invoke(months);
}
}
}
For other types such as int
namespace SendToMainForm
{
public partial class ChildForm : Form
{
public delegate void OnPassMonths(int[] monthNames);
public event OnPassMonths PassMonths;
public ChildForm()
{
InitializeComponent();
}
private void SendDataToMainFormButton_Click(object sender, EventArgs e)
{
PassMonths?.Invoke(new[] { 1, 2, 3 });
}
}
}
And
namespace SendToMainForm
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void OpenChildFormButton_Click(object sender, EventArgs e)
{
ChildForm childForm = new() { Owner = this };
childForm.PassMonths += ChildFormOnPassMonths;
childForm.Show(this);
childForm.Top = Top;
childForm.Left = Left + Width + 10;
}
private void ChildFormOnPassMonths(int[] data)
{
listBox1.Items.AddRange(Array.ConvertAll(data, x => x.ToString()));
}
}
}