28 messaggi dal 31 maggio 2007
ciao vi presento il mio caso, forse banale ma che mi fa impazzire!

Ora sappiamo tutti quanto sia facile visualizzare dati nei datagrid/detailview/formview dando in pasto come datasource una qualsiasi fonte di interfaccia Collection ad esempio un bel datatable.

Il problema è il seguente; ho un bel formview generato dal datatable, l'utente modifica i dati on line... ma come faccio ad avere i dati modificati sempre come datatable?

se metto un bel tasto e all'evento click riesco a recuperare il datasource e anche a castarlo a datatable correttamente, peccato che i dati siano quelli originali e non quelli modificati.

Alcuni propongono soluzioni d'urto tipo scorrere tutte le righe dell' oggetto datagrid/detailview/formview... non essite un modo piu facile?

vi allego il mio esempio

SqlConnection nwindConn = new SqlConnection(ConfigurationManager.ConnectionStrings["NORTHWINDConnectionString"].ConnectionString);

custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
custCB = new SqlCommandBuilder(custDA);

//nwindConn.Open();
custDS = new DataSet();

custDS.AcceptChanges();

//creo i comandi x le operazioni di aggiornamento
custDA.UpdateCommand = custCB.GetUpdateCommand();
custDA.InsertCommand = custCB.GetInsertCommand();
custDA.DeleteCommand = custCB.GetDeleteCommand();

custDA.Fill(custDS, "Customers");

DetailsView1.DataSource = custDS.Tables["Customers"];
DetailsView1.DefaultMode = DetailsViewMode.Edit;
DetailsView1.AutoGenerateRows = true;
DetailsView1.AutoGenerateDeleteButton = true;
DetailsView1.AutoGenerateInsertButton = true;
DetailsView1.AutoGenerateEditButton = true;

a questo punto il mio detailview è bello in modalità modifica e con i suoi bei bottoni insert/update/delete, solo che se clicco su questi nn succede niente, cosa manca?

Ho provato a aggiungere io un tasto, e a recuperate il datatale ,ma è sempre quello originale x cui i dati vengono salvati si, ma sono vecchi per cui le modifiche perse :(

protected void Button1_Click(object sender, EventArgs e)
{

DataTable a = (DataTable)DetailsView1.DataSource;
string l = a.Rows[0]["nome"].ToString();
custDA.AcceptChangesDuringUpdate = true;

custDA.Update(a);
DetailsView1.DataBind();
}

help :)
è il DataSource originale perche probabilmente associ la fonte dati al FormView ad ogni caricamento.

deto questo, anche associandola al primo Postback non risolveresti il problema, e la "terapia" che ti hanno proposto è la via giusta se non vuoi utilizzare un ObjectDataSource o un SqlDataSource

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
2.859 messaggi dal 28 gennaio 2003
Io ho un vecchissimo esempio, che fa uso di un DataGrid, caricato da un DataSet.
E' un esempio a solo scopo didattico, difficilmente applicabile in realtà.
A grandi linee:

creo una variabile di istanza, privata:
Private ds As New DataSet()

Nell'evento load riempio il dataset la prima volta; le altre la recupero dalla session.

evento load
{
se non postback allora
{ riempio il dataset da database; lo salvo nella session; dataBind }
altrimenti
{ recupero il dataset dalla session}
}

procedura dataBind
{è la classica procedura per visualizzare i dati nella griglia, da un dataset}


L'evento UpdateCommand si verifica quando, in modalità edit, premo il tasto Update

Evento DataGrid1_UpdateCommand
{
'ricavo un riferimento alla riga da modificare, per esempio
Dim dgi As DataGridItem = Me.DataGrid1.Items(e.Item.ItemIndex)

'ricavo il datarow che corrisponde alla chiave, per esempio
Dim dr As DataRow = GetDataRow(Me.DataGrid1.DataKeys(e.Item.ItemIndex).ToString)

'aggiorno le colonne del datarow, per esempio
dr("title") = DirectCast(dgi.Cells(1).Controls(1), TextBox).Text

'alla fine, non sono più in modalità edit
Me.DataGrid1.EditItemIndex = -1

'e rileggo i dati
BindDataGrid()


}


Il dataset contiene i dati modificati dall'utente. In seguito bisognerà immettere le modifiche nel Database.

A parte lo pseudocodice, la logica credo che sia quella.

Pietro
28 messaggi dal 31 maggio 2007
A me va benissimo usare ObjectDataSource solo che nei classici esempi che si trovano in letteratura ObjectDataSource usa i metodi del DataAdapter per leggere i dati (select) e poi salvarli (inset/update/delete), non legge e non aggiorna un oggetto. Il problema sta che è difficile impostare una logica di Business BLL.

Lo scopo è solo quello di fare il "giro" che la buona ingegneria del software ci insegna ossia.

1) creo un oggetto ad esempio dtUtenti usando il metodo select del DataAdapter
2) creo un gridview con datasource il dtUtenti.
3) l'utente modifica i dati
4) recupero il dtUtenti
5) applico logiche di valutazione formale e business BLL
6) salvo l'ogetto attraverso i metodi del DataAdapter

ecco questo è quello che voglio fare, ci posso riuscire con un ObjectDataSource?
Ho cercato in giro ma nessuno usa questa politica

Secondo l'impostazione Microsoft le logiche di business sarebbero delegate a delle castomizzazioni dei metodi del DataAdapter, cosa che mi costringe a non essere astratto nei dati.

Grazie
come suggerisce il nome "ObjectDataSource " questo controllo nasce apposta per lavorare con gli oggetti, se dai un occhiata a questo articolo:

http://www.aspitalia.com/articoli/asp.net2/DataSource-p-2.aspx#title_2

ne avrai una rapida panoramica delle funzionalità.

puoi crearti una tua classe custom, con i metodi di inserimento, modifica ed eliminazione e utilizzare quella

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC