Newsgroup: it.comp.dotnet
Titolo: Bindingsource.RemoveCurrent non funziona

Salve a tutti,
ho un db sql server 2005 con la connessione impostata non con il
wizard di VS e una datagrid collegata al bindingsource.
Accade che quando elimino una riga in effetti viene eliminata ma
riaprendo l'applicazione mi accorgo che è ancora li, quindi le
modifiche non vengono trasmesse al database.
nell'evento del button ho messo questo
private void btnFerieElimina_Click(object sender, EventArgs e)
{
    binsourceFerie.RemoveCurrent();
    binsourceFerie.EndEdit();
}
per la connessione uso questo
private void LoadAndShowFerie()
{
    sqldadptrFerie = new SqlDataAdapter("SELECT * FROM Godute",
connString);            
    sqldadptrFerie.Fill(dtblFerie);
    binsourceFerie.DataSource = dtblFerie;
    binsourceFerie.Filter = "Categoria='Ferie'";
    gridFerie.DataSource = binsourceFerie;
}
Dove sbaglio? Come posso fare?
Grazie.

 Dove sbaglio? Come posso fare?
che EndEdit seplicemente fa il commit delle modifiche verso la 
DataSource ma nulla di più da li al db ci devi ancora andare e devi 
farlo tu.
Documentazione delle mie brame :-)
http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.endedit.aspx
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 .m
Grazie Mauro per il link.
A dir la verità mi pare una spiegazione alquanto ermetica, per le mie
capacità perlomeno :)
Vuoi dire che devo scrivere io i comandi per aggiornare il db?
Dove posso trovare uno spunto?
Grazie ancora.

 Dove posso trovare uno spunto?
Perdonami ma se usi qualcosa senza avere la più pallida idea di come 
funziona, perchè è ovvio che non ne hai la più pallida idea, come puoi 
dire che la documentazione sia criptica?
Comunque: 
http://support.microsoft.com/kb/308507/en-us


 Comunque:
http://support.microsoft.com/kb/308507/en-us
Grazie, ora me la studio.

 sempre capito tutto alla prima? Io no :)
quasi mai capisco tutto al primo colpo ma di sicuro mi faccio una 
quantità industriale di domande prima di chiedere in giro, ma 
soprattutto leggo e cerco documentazione.
Se facciamo una breve analisi della domanda e partiamo dal problema, o 
presunto tale:
private void btnFerieElimina_Click(object sender, EventArgs e)
{
    binsourceFerie.RemoveCurrent();
    binsourceFerie.EndEdit();
}
scopriamo che ci sono due righe di codice che richiamano funzionalità 
built-in nel framework. Ora partire dal presupposto che se quelle due 
righe di codice non producono il risultato che ci si aspetta sia 
imputabile ad un bug o malfuzionamento (perchè "RemoveCurrent non 
funziona" questo significa a casa mia) mi sembra un filino presuntuoso, 
soprattutto se non si sa cosa fanno quelle due righe di codice.
Se andiamo a guardare la documentazione, per EndEdit troviamo: "Applies 
pending changes to the underlying data source." mentre per 
RemoveCurrent: "Removes the current item from the list.".
Senza approfondire oltre la prima cosa che mi salta all'occhio è che da 
nessuna parte, neanche nei remarks, si parla di DataBase, ma sempre e 
solo di DataSource o List, ergo il BindingSource non sa assolutamente 
nulla di database ma si appooggia ad una DataSource, che in questo caso 
è una DataTable (per l'esattezza una DataView, ma è un dettaglio):
private void LoadAndShowFerie()
{
    sqldadptrFerie = new SqlDataAdapter("SELECT * FROM Godute",
connString);
    sqldadptrFerie.Fill(dtblFerie);
    binsourceFerie.DataSource = dtblFerie;
    binsourceFerie.Filter = "Categoria='Ferie'";
    gridFerie.DataSource = binsourceFerie;
}
caricata da codice; questo però evidenzia il fatto che non è ben chiaro 
il concetto di *disconnesso* del mondo ADO.Net: una volta che è stato 
chiamato il metodo Fill del DataAdapter e i dati sono stati caricati in 
memoria per la DataTable in questione il DataBase non esiste più, per 
l'esattezza la DataTable non ha mai saputo un bel nulla di DataBase, 
l'unico che sa qualcosa del fatto che esista un DataBase è proprio il 
DataAdapter, che dopo aver fatto il suo lavoro di caricamento si 
dimentica proprio dell'esistenza del db (tant'è che si potrebbe 
tranquillamente staccare il cavo di rete e tutto funzionerebbe che è un 
piacere).
Quello che succede quindi è:
- connessione al db;
- caricamento dei dati;
- *disconnessione* dal db;
- uso dei dati in memoria, conservati in una struttura che si chiama 
DataTable, come DataSource di qualcosa;
- la DataTable viene consumata dal BindingSource (cosa che nel caso di 
una DataTable/DataView è una ridondanza inutile) come DataSource;
- il BindingSource diventa DataSource di un controllo Windows Forms 
come la DataGrid che *sa* come fare a dialogare con qualcosa che è 
IBindingList, cosa che il BindingSource è.


 beneficio del dubbio è quantomeno doveroso.
il beneficio del dubbio c'è sempre questo è ovvio, in questo caso mi 
baso su un fatto solo, questo:"Bindingsource.RemoveCurrent non 
funziona" che in italiano ha un significato non opinabile, tutto li.


 blog @
http://milestone.topics.it
