salvare una cella editabile

Ciao Antonio

In una listbox dopo aver editato un CELLA DIRETTAMENTE NELLA LISTBOX , COME FACCIO POI A SALVARE ILO DATO NUOVO?
FINO ADESSO EDITO LA CELLA MA POI QUANDO TRATTO DI SALVARE LA INFORMAZIONE SCOMPARE.

DOVE SBAGLIO?

GRAZIE COME SEMPRE

CIAO

Ciao Alan,
non mi hai detto come “salvi” il dato.

Faccio un esempio, ma visto che non descrivi nulla potrebbe non essere il tuo caso:
Carichi la listbox da dati presi da una query a database.
Editi la cella e memorizzi il nuovo valore nel database.
Ricarichi i dati.

Se il salvataggio per qualche motivo non va a buon fine, ricarichi il dato originale.

Di per se, quando editi una cella di una listbox il valore della cella quello inserito, se ritorna allo stato originale vuol dire solamente che in qualche modo lo ripristini.

Ciao Antonio

cosi come salvo i dati

dim rec as DatabaseRecord
dim rs as RecordSet

// Update customer data
if Label53.Text = “” then
// If we don’t have a Customer ID then we need to enter a new record.

// Create a new database record with all of the customer information
rec = New DatabaseRecord
rec.Column("fattura") = TextField41.Text
rec.Column("Prodotto") =TextField35.Text
rec.Column("quantita") = TextField36.Text
rec.Column("prezzo") = TextField37.Text
rec.Column("sconto") = TextField38.Text
rec.Column("totale") = TextField39.Text
rec.Column("codice") = TextField45.Text
rec.Column("impiegata") = TextField42.Text
rec.Column("codice_impiegata") = TextField43.Text
rec.PictureColumn("codice_barre")= codiceBarre.Backdrop
rec.PictureColumn("foto")=fotoImpiegata.Backdrop
rec.PictureColumn("foto_prodotto")=fotoProdotto.Backdrop
// Insert Record Into table "Cliente" of the Database
pagamenti.InsertRecord "pagamenti", rec

// Display Error If One Occurred
if pagamenti.Error then
  DisplayDatabaseError_Pagamenti true
  return
end if

else
// We have a customer id so we should update the existing record

// Find the existing record by searching for the customer name
rs = pagamenti.SQLSelect("SELECT * FROM pagamenti WHERE Id = '" +(Label53.Text) + "'")
if pagamenti.error then
  DisplayDatabaseError_Pagamenti true
  return
end if

// Update the existing database record.  First we need to make the
// RecordSet editable which will try to obtain a lock on the record.
// Be sure to check for errors after calling RecordSet.Edit in case
// something went wrong here.
rs.Edit
if pagamenti.error then
  DisplayDatabaseError_Pagamenti true
end

// Update the customer information
rs.Field("Id").StringValue = Label53.Text
rs.Field("fattura").StringValue = TextField41.Text
rs.Field("Prodotto").StringValue = TextField35.Text
rs.Field("quantita").StringValue = TextField36.Text
rs.Field("prezzo").StringValue = TextField37.Text
rs.Field("sconto").StringValue = TextField38.Text
rs.Field("totale").StringValue = TextField39.Text
rs.Field("codice").StringValue = TextField45.Text
rs.Field("impiegata").StringValue = TextField42.Text
rs.Field("codice_impiegata").StringValue = TextField43.Text
rs.Field("codice_barre").PictureValue= codiceBarre.Backdrop
rs.Field("foto").PictureValue= fotoImpiegata.Backdrop
rs.Field("foto_prodotto").PictureValue= fotoProdotto.Backdrop
// Update the record in the database
rs.Update
if pagamenti.Error then// handle errors
  DisplayDatabaseError_Pagamenti true
  return
end if

end

// Commit changes to the database
pagamenti.Commit

// Update the list of customers
UpdateListBox5

quando faccio click su una cella editabile cambio il valore e con lo stesso metodo dovre poter salvare , ma non cosi, perche dopo aver salvato il valore nuovo nella cella editale sparisce e ricompare quello vecchio, mentre se edito il valore da una textfield come puoi vedere da codice il valore nuovo lo prende

dove sbaglio

grazie Antonio

Scusa Alan, ma questo il codice di quando aggiorni dalle textfield.
Non vedo in nessuna riga un riferimento alla listbox a parte un updateListBox5 che presumo serve ad aggiornare la lista.

SI infatti come deve essere il riferimento alla listbox?

non riesco a venirne fuori

se mi posti il contenuto di updateListbox5 (dove probabilmente carichi i dati nella listbox) posso farti un esempio più chiaro che in teoria.

Comunque la teoria sarebbe:
Come carichi il dato con Listbox5.cell(riga,colonnaX)=campoX

puoi fare il contrario:
CampoX=listbox5.cell(riga,colonnaX)

ECCOLO

// Attualizzo la informazione del cliente

dim sql as String
Dim rs as RecordSet

sql= " SELECT * FROM pagamenti "

rs = pagamenti.sqlSelect(sql)
PopulateListBox Listbox5, rs
rs.close

:confused:
Questo lo immaginavo… magari PopulateListBox…

MAESTRO LEI HA SEMPRE RAGIONE

if rs Is Nil Then Return



'If rs.RecordCount > 5000 then
'MsgBox" Please Update to iTattoo Studio Master"
'Timer4.Enabled= true
'Timer4.Mode=1
'end if

// codice per limitare il numero di celle che si possono salvare.
// Add the DB columns as the heades for the ListBox
lb.DeleteAllRows

// Add the data from the table
While Not rs.EOF
lb.AddRow("")

For i As Integer = 0 To rs.FieldCount-1
  lb.Cell(lb.LastIndex, i) = rs.IdxField(i+1).StringValue
Next

rs.MoveNext

Wend

// If the listbox is set to be sorted by a particular column then we want to
// sort the listbox contents after we populate it, so that they appear in the
// correct order.
if lb.sortedColumn > -1 then// the listbox is sorted by a column
lb.sort// sort the listbox data using the current sort settings
end

sei troppo in gamba, ho trovato l’errore , praticamente non dicevo quale era il numero della colonna

grazie Maestro

:slight_smile:
Mi piace essere d’aiuto anche solo con la presenza!

Anch’io ho una richiesta di aiuto (ma vedo che l’ultimo post ha 5 anni…): in una tabella devo fare una specie di Excel (calcolare l’espressione in un campo).
Tutto bene fino all’editare l’espressione in una cella, e con l’algoritmo per il calcolo, che funziona. Il trigger il rilievo del tasto battuto in CellKeyDown (ad esempio CR, o freccia).
Viene correttamente chiamata la subroutine (pardon: il metodo…) per il calcolo, ma nell’evento CellKeyDown l’istruzione
me.cell(row,column) =Calcola_cella(espressione,row,column)
lascia la cella invariata (continua a mostrarsi l’espressione).
Per mostrare il risultato nella cella, devo passare il valore calcolato a una variabile globale (string_bridge), e scrivere
me.cell(row,column)=string_bridge
nell’evento CellAction
Mi sembra poco elegante, e deve esserci qualcosa che non capisco. Che alternativa pi corretta ci pu essere? Grazie!!!

… hai provato a effettuare il calcolo in cellAction?

Grazie per la velocissima risposta.

Ho provato, ma non mi funziona, perch non so come passare a cellAction il tasto rilevato in CellKeyDown. Dovrei sempre passare per una variabile globale, il che sempre poco elegante.

credo che dipenda molto da come hai implementato la cosa.

qualche esempio di come approcci potrebbe essere utile.
Posso immaginare cosa fai e il motivo per cui non ti funziona, ma potresti aver fatto in un modo diverso per cui sarebbe meglio se posti qualche frammento di codice essenziale.

in CellKeyDown:

If Key=CR Then
Dim espressione As String
espressione=me.Cell(row,5) ’ una formula tipo 3*2+5/7-4

If column=5 Then 
  ListBox_Farmaci.ColumnType(5)=ListBox_Farmaci.TypeEditable
  Me.EditCell(row, 5)
  me.cell(row,5)=Calcola_cella(espressione)    'non sortisce effetto: lascia l'espressione 3*2 etc
  espressione=Calcola_cella(espressione)
  string_bridge=espressione
End If

Select case espressione
'.... controlli vari su caratteri illeciti
Case else
  
  me.Refresh      'inutile....
  PushButton_Salva.Enabled=True
End Select

End If

Se usi cellKeyDown, stai gi editando la cella non necessario chiamare me.editCell (a meno che non vuoi cambiare cella)

se non “fermi” il carattere , con return true, questo viene interpretato anche dopo l’evento e quindi puoi interpretare

La sequenza degli eventi in genere :
Fai click nella cella:
CellGotFocus -> il textfield gi con il contenuto della cella, volendo se vuoi puoi trasformarlo in una formula se ti serve

Scrivi:
CellKeyDown -> modifichi il contenuto del textField, puoi interpretare e bloccare caratteri, magari utile per il tab per andare in altre celle, inutile con il CR visto che lo utilizza comunque per chiudere la sessione di editing

Esci dalla cella:
CellAction -> qui il valore della cella gi aggiornato a quello del textEdit (sono identici) puoi utilizzarlo per convertire il testo (formula) in test (risultato) ad esempio “60+5” e ottenere “65” semplicemente assegnando “65” al valore della cella (a questo punto ovviamente i valori della cella e del textField saranno diversi)

dopo viene chiamato anche:
cellLostFocus , ma puoi fare tutto prima e utilizzato magari per altre cose se ti serve.

Morale della storia aggiornando in cellAction, aggiorna la cella

Grazie mille! domani provo, ma mi pare di aver capito la logica. Se non senti nulla, vuol dire che ho capito davvero, e ti faccio molti auguri, altrimenti ridisturber…