Jedan od nacina je da glavnu formu, neka bude da je to klasa MainForm, koristis kao singleton i da joj tako pristupas iz forme Form1 (neka bude klasa FormView) i Form2 (neka bude klasa FormEdit).
Postoji dosta raznih implementacija singleton-a, ova koju sam ubacio je verovatno najjednostavnija i bezbedna u smislu thread-safe za ovo sto ti treba jer pretpostavljam da neces kreirati instancu MainForm nikad osim na pocetku u Program.cs (po default-u).
Opsirnije o nacinima implementacije singleton-a na
http://www.yoda.arachsys.com/csharp/singleton.html.
Slede delovi koda:
Code:
namespace MyApplication;
public MainForm : Form
{
public MainForm()
{
instance = this;
...
...
...
}
public static MainForm Instance
{
get
{
return instance;
}
}
public FormView FrmView
{
get
{
return frmView;
}
}
public FormEdit FrmEdit
{
get
{
return frmEdit;
}
}
private static MainForm instance = new MainForm();
private FormView frmView = null;
private FormEdit frmEdit = null;
}
Pretpostavljam da iz glavne forme kreiras i prikazujes (Show) instance ove dve forme i to neka budu ove dve privatne promenljive u njoj.
Zatim, u kodu forme FormView ubaci jednu public metodu (i jedan delegat ako su ti potrebni parametri za metodu koja osvezava DataGridView)
Code:
public FormView : Form
{
...
...
...
// varijanta bez parametara
public void RefreshDataGridView()
{
// radis ovako da bi metoda bila thread-safe (da bi dataGridView1 pozivao iz iste niti iz koje je kreirana)
if (base.InvokeRequired == true)
{
base.BeginInvoke(new MethodInvoker(RefreshDataGridView), new object[] { });
}
else
{
//
// ovde ubaci kod kojim osvezavas DataGridView u ovoj formi
//
// odavde mozes da "vidis" formu FrmEdit ako treba, koristeci MainForm.Instance.FrmEdit, a time i sve njene public field-ove i metode
//
}
}
// varijanta sa parametrima (ovo je samo primer ako su 2 parametra, jedan int i jedan string)
public void RefreshDataGridView(int param1, string param2)
{
if (base.InvokeRequired == true)
{
base.BeginInvoke(new RefreshDataGridViewHandler(RefreshDataGridView), new object[] { param1, param2});
}
else
{
//
// ovde ubaci kod kojim osvezavas DataGridView u ovoj formi i u kome koristis parametre
//
// odavde mozes da "vidis" formu FrmEdit ako treba, koristeci MainForm.Instance.FrmEdit, a time i sve njene public field-ove i metode
//
}
}
private void delegate RefreshDataGridViewHandler(int par1, string par2);
}
Ovako si dobio metodu koju si trazio, a koja bi osvezavala dataGridView1 tako sto bi je iz koda forme FrmEdit pozivao sa
Code:
MainForm.Instance.FrmView.RefreshDataGridView();
// odnosno sa
MainForm.Instance.FrmView.RefreshDataGridView(param1, param2);
(Pretpostavka je da su sve 3 forme u istom namespace-u)
Jedan od jednostavnih nacina kako mozes ovo iskoristiti je da u formi FrmView imas neku promenljivu koja ce ti biti DataSource za ovaj DataGridView (na primer DataTable) i da tu promenljivu menjas cim promenis nesto u FrmEdit, pa ce ti se i DataGridView "automatski" azurirati.
Primer koda:
U FrmView:
Code:
private DataTable dataSource = new DataTable();
// negde u kodu (recimo u konstruktoru ili pri inicijalizaciji kad vec imas strukturu dataSource-a u smislu kolona), stavis
this.dataGridView1.DataSource = this.dataSource;
// a u metodi RefreshDataGridView mozes da postavljas this.dataSource citajuci sta ti treba iz FrmEdit
// ili da prosledis DataTable kao parametar u kom slucaju bi koristio delegat
private delegate void RefreshDataGridViewHandler(DataTable dataTable)
// i u skladu sa tim modifikujes potpis i metodu RefreshDataGridView.
U svakom slucaju, koristeci MainForm instancu kao singleton, mozes iz FrmView pozivati/menjati sta ti treba u FrmEdit i obrnuto koristeci public metode preko
Code:
MainForm.Instance.FrmView.SomePublicMethod
// odnosno
MainForm.Instance.FrmEdit.SomePublicMethod
tako da ces naci nacin koji najvise odgovara potrebama aplikacije.
Pozdrav.