Правильный способ обработки этого сценария - через пользовательские события.
Давайте начнем с определения класса, который мы будем использовать для передачи информации между формой ScreenLocation и формой Buttons . Этот класс должен быть общедоступным и видимым для обоих классов форм (одно и то же пространство имен), он может находиться в своем собственном файле или просто добавляться в форму ScreenLocation / Buttons
public class ButtonData
{
public int ID { get; set; }
public string Name { get; set; }
public Rectangle Rect { get; set; }
}
Теперь мы добавим код пластины котла, необходимый для определения события, вызванного ScreenLocation form
public class ScreenSelection : Form
{
public delegate void onDataReady(ButtonData data);
public event onDataReady DataReady;
....
}
В этот момент мы можем изменить класс ScreenLocation , добавив код, который вызывает событие, когда данные готовы для передачи любому, кто прослушивает событие.
Например, обработчик ButtonClick внутри ScreenLocation может быть написан таким образом
protected void ButtonSave_Click(object sender, EventArgs e)
{
// Anyone has subscribed to the event?
if(DataReady != null)
{
ButtonData btn = new ButtonData();
// Change these GetXXXXValue with the appropriate code
// that extracts the info from the ScreenLocation UI.
btn.ID = GetTheIDValue();
btn.Name = GetTheNameValue();
btn.Rect = GetTheRectValue();
// Send the info to the interested parties.
DataReady(btn);
}
}
Круг замыкается при создании экземпляра ScreenLocation в вашем коде из формы Buttons .
private void LaunchScreenSelection_Click(object sender, EventArgs e)
{
ss = new ScreenSelection(buttonData);
// Tell the ScreenLocation ss instance that we are
// interested to know when new data is ready
ss.DataReady += myDataLoader;
ss.Show(this);
}
// When the *ScreenLocation* instance will raise the event,
// we will be called here to handle the event
private void myDataLoader(ButtonData btn)
{
// Now you have your info from the ScreenLocation instance
// and you can add it to the datatable used as datasource for the grid
DataTable dt = AllEventData.Tables["AllEventData"];
dt.Rows.Add(btn.ID, btn.Name, btn.Rect);
}