RaouL_BennetH
10-10-2010, 21:15
Ciao a tutti :)
Sto lavorando con l'entity framework ed ho dei problemi (credo i classici...) a gestire determinate operazioni.
Attualmente il progetto è di tipo WinForms.
Il problema che ho è il seguente:
Ho il classico form contenente alcune caselle di input ed una griglia.
Durante l'inserimento/modifica dei dati , ho un semplice form di attesa, e dopo l'inserimento/modifica la mia griglia deve aggiornarsi.
Attualmente il codice è questo:
//context è il mio EntityModel
public MyForm()
{
InitializeComponent();
base.SaveClicked += new ButtonClickHandler(SaveEntity);
base.UpdateClicked += new ButtonClickHandler(UpdateEntity);
context = new EFHelper();
validator = new InputValidator();
}
private void MyForm_Load(object sender, EventArgs e)
{
//popolo la griglia
GridRefresh();
}
void GridRefresh()
{
var result = (from contratti in context.Categoria_Contratti
select contratti).ToList();
contrattiBindingSource.DataSource = result;
}
private void SaveEntity()
{
context.AddToCategoria_Contratti(contratto);
context.SaveChanges();
GridRefresh();
}
In questo caso, tutto va bene e non ci sono problemi.
Io invece volevo strafare e mi sono incasinato...
public class Worker()
{
private BackGroundWorker bw;
private FormWait wf;
public void WorkAsync()
{
wf = new FormWait();
wf.Show();
bw = new BackGroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
wf.Close();
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
devo_far_partire_un_metodo_che_qui_non_conosco
}
In parte ci sono anche riuscito con qualche bruttura:
public delegate void ProvaChiamata();
public ProvaChiamata metodoInvocato;
//nel bw_DoWork...
metodoInvocato();
Per quanto riguarda l'inserimento dei dati, la mia SaveEntity diventa quindi:
private void SaveEntity()
{
Worker worker = new Worker();
worker.metodoInvocato = delegate()
{
context.AddToCategoria_Contratti(contratto);
context.SaveChanges();
GridRefresh();
};
worker.WorkAsync();
}
Bene.. cioè, male, l'inserimento me lo effettua, ma quando deve aggiornare la griglia mi solleva l'eccezione di: "Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'gridView' da un thread diverso da quello da cui è stata eseguita la creazione"
Sto lavorando con l'entity framework ed ho dei problemi (credo i classici...) a gestire determinate operazioni.
Attualmente il progetto è di tipo WinForms.
Il problema che ho è il seguente:
Ho il classico form contenente alcune caselle di input ed una griglia.
Durante l'inserimento/modifica dei dati , ho un semplice form di attesa, e dopo l'inserimento/modifica la mia griglia deve aggiornarsi.
Attualmente il codice è questo:
//context è il mio EntityModel
public MyForm()
{
InitializeComponent();
base.SaveClicked += new ButtonClickHandler(SaveEntity);
base.UpdateClicked += new ButtonClickHandler(UpdateEntity);
context = new EFHelper();
validator = new InputValidator();
}
private void MyForm_Load(object sender, EventArgs e)
{
//popolo la griglia
GridRefresh();
}
void GridRefresh()
{
var result = (from contratti in context.Categoria_Contratti
select contratti).ToList();
contrattiBindingSource.DataSource = result;
}
private void SaveEntity()
{
context.AddToCategoria_Contratti(contratto);
context.SaveChanges();
GridRefresh();
}
In questo caso, tutto va bene e non ci sono problemi.
Io invece volevo strafare e mi sono incasinato...
public class Worker()
{
private BackGroundWorker bw;
private FormWait wf;
public void WorkAsync()
{
wf = new FormWait();
wf.Show();
bw = new BackGroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
wf.Close();
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
devo_far_partire_un_metodo_che_qui_non_conosco
}
In parte ci sono anche riuscito con qualche bruttura:
public delegate void ProvaChiamata();
public ProvaChiamata metodoInvocato;
//nel bw_DoWork...
metodoInvocato();
Per quanto riguarda l'inserimento dei dati, la mia SaveEntity diventa quindi:
private void SaveEntity()
{
Worker worker = new Worker();
worker.metodoInvocato = delegate()
{
context.AddToCategoria_Contratti(contratto);
context.SaveChanges();
GridRefresh();
};
worker.WorkAsync();
}
Bene.. cioè, male, l'inserimento me lo effettua, ma quando deve aggiornare la griglia mi solleva l'eccezione di: "Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'gridView' da un thread diverso da quello da cui è stata eseguita la creazione"