Autore Topic: ColumnView  (Letto 3327 volte)

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
ColumnView
« il: 09 Gennaio 2009, 13:59:13 »
problemino...
Avendo una columnview popolata con un indice non ordinato e non contiguo come fare per leggere tutto il suo contenuto ?
Mi spiego meglio, da ora in poi CV = ColumnView. Devo cambiare proprietario a determinate macchine per cui:
Ho una prima CV (CV1) popolata dalle macchine di un determinato cliente per cui l'indice della CV1 è uguale agli id delle macchine di quel cliente.
Nella seconda CV (CV2) sposto 1 o piu macchine selezionandole dalla CV1. Ovviamente l'indice della CV2 sarà popolato dagli id delle macchine.

a questo punto dovrei fare l'update delle macchine che si trovano in CV2, sostituendo il riferimento al cliente, ma non riesco a leggere i dati nella CV. Ho provato con  CV.move..., .selectall, ma non viene selezionata alcuna riga e tantomeno ne risulta la key.

OT
Se uso la combobox non posso dargli l'indice che voglio.
Se uso le gridview quando seleziono mi seleziona la cella e non la riga.
Se uso la tableview non ho capito cosa cambia rispetto la gridview.
Se uso la columnview riesco a leggerne i dati solo se selezionati col mouse .....

Ho letto le motivazioni che hanno spinto Benoit a dar vita a Gambas, cioè di dare la possibilità a persone con poca esperienza nella programmazione di crearsi le proprie applicazioni, facendo riferimento a manager o capi ufficio.
Ora, non penso che questi manager o chi, come noi usa gambas, si mettano a programmare video giochi, o gestionali con grafici 3D in opengl, o che ne so io. Fondamentalmente lo si usa per creare dei gestionali, e allora perchè caro Benoit, non concentrarsi prima sul mettere a disposizione componenti anche basilari , ma completi e completamente funzionanti e magari con documentazione esaustiva e completa di esempi ? Sono passato da poco a linux (ubuntu) e da pochissimo a Gambas proveniendo da Windows e MSAccess. Sto provando a rifare quello che già avevo fatto con VBA sforzandomi di non pentirmi nel voler cambiare.
Scusate lo sfogo

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #1 il: 09 Gennaio 2009, 15:01:38 »
Il problema l'ho risolto caricando gli stessi dati della CV2 anche in una tabella buffer che uso poi per l'update definitivo. Funziona, ma è un compromesso che vorrei evitare.

bye

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ColumnView
« Risposta #2 il: 09 Gennaio 2009, 15:20:49 »
1) con la GridView selezioni sì una singola cella ma hai comunque l'indicazione della riga a cui appartiene la cella selezionata con GridView.Row.

2) la ColumnView è quella che ti mostra visualmente la selezione della singola riga. Per leggere i dati delle singole righe non devi far altro che usare la ColumnView come una matrice.
Ecco un semplice esempio di codice, basato su una ColumnView chiamata Griglia:

Codice: [Seleziona]

PUBLIC SUB Form_Open()
  Griglia.Clear
  Griglia.Columns.Count = 4
  Griglia.Columns[0].Width = 90
  Griglia.Columns[1].Width = 240
  Griglia.Columns[2].Width = 60
  Griglia.Columns[3].Width = 240
  Griglia.Columns[0].Text = "Targa"
  Griglia.Columns[1].Text = "Veicolo"
  Griglia.Columns[2].Text = "Chiave"
  Griglia.Columns[3].Text = "Cliente"
END SUB

PUBLIC SUB Griglia_Click()
  txtTarga.Text = griglia.Item[0]
  txtVeicolo.Text = griglia.Item[1]
END

Nell'esempio riportato costruisco una griglia di 4 colonne e la riempio con i dati letti da un DB contenente le auto dei clienti (tralascio il codice di questo passaggio, insignificante per il tuo problema).
Cliccando sulla ColumnView, leggo dalla griglia i valori della cella 0 e della cella 1. Non mi devo preoccupare della riga perché questa è selezionata in automatico dall'oggetto.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #3 il: 09 Gennaio 2009, 15:49:52 »
Innanzi tutto Grazie.
Però il problema  sta proprio nel fatto che non riesco a caricare nella columnview niente a parte la key e la prima stinga.
Quando faccio columnview.add(Key as String, Text as String [,......
quindi : columnview.add("key","TO 313") va bene
columnview.add("key", "TO 313", "Balilla") da errore
Come si fa ?
tks

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ColumnView
« Risposta #4 il: 09 Gennaio 2009, 16:08:21 »
Guarda il codice che ho pubblicato.
1) azzero la columnview;
2) imposto il n° di colonne;
3) usando un indice matriciale, imposto il testo per la colonna di testa;
4) imposto la larghezza delle singole colonne.

A questo punto le popolo con un semplice ciclo FOR. Ricordati che la ColumnView accetta la creazione dinamica di righe con il metodo Add(Chiave, Testo) dove Chiave è una chiave usata internamente, che io imposto sempre alla chiave del DB, in modo che sia un valore univoco). Il dato Testo viene impostato in automatico nella cella 0 della riga in fase di creazione. Per aggiungere gli altri valori basta poi usare la proprietà Item():
Codice: [Seleziona]

FOR i = 1 to Risultato.Count
  Griglia.Add(Risultato["targa"], Risultato["targa"])
  Griglia.Item[1] = Risultato["veicolo"]
  Griglia.Item[2] = Risultato["chiave"]
  Griglia.Item[3] = Risultato["nominativo"]
NEXT
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #5 il: 09 Gennaio 2009, 16:17:00 »
Ti ringrazio infinitamente, soprattutto per la tempestività con la quale mi hai risposto.
Ho provato e funziona, che devo di, scusatemi per la mia niubbaggine!

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #6 il: 09 Gennaio 2009, 16:50:32 »
A questo punto però (per il mio caso) conviene impostare le key come indici contigui e mettere la chiave come nel tuo esempio. In tal modo si può andare a leggere l'elenco puntanto la key in un ciclo

for i = 0 to griglia.count -1
 griglia.MoveTo(i)
 if griglia.item[2] = ......
.....
next

mille grazie.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ColumnView
« Risposta #7 il: 09 Gennaio 2009, 23:10:51 »
Occhio!
"Chiave", nel mio esempio, è il n° di chiave dove appendo la chiave del cliente, non è la chiave intesa come Key!!  :oops:
Quella la metto nella proprietà della riga che creo con Griglia.Add(Chiave(cioè Key), Testo).
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #8 il: 10 Gennaio 2009, 00:01:33 »
penso di aver capito giusto.

key = indice della lista contenuta nella columnview
chiave = chiave primaria del record nel database (che credo tu inserisca in 'testo' e non in un item, il che è comodo e più lineare)

non ho ancora provato ma immagino che si possa eventualmente nascondere impostando la larghezza della a colonna a 0.

ot
non penso di riuscire a provare il discorso mail adesso perchè ho troppo sonno. Rimanderò alla prossima settimana.

tks e buon fine settimana a tutti.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: ColumnView
« Risposta #9 il: 10 Gennaio 2009, 06:37:38 »
Probabilmente ho ingenerato confusione io con i nomi adoperati, mi dispiace: "chiave" nel mio esempio è proprio la chiave dell'auto del cliente :-), mentre la Key della ColumnView è, nel mio esempio, il dato Risultato["targa"]. E' un estratto di codice preso da un mio programma, per cui devi scremare il nome delle variabili da quello dei campi.

Rileggi il mio codice così, se ti torna meglio:
Codice: [Seleziona]

FOR i = 1 to Risultato.Count
  Griglia.Add(ChiavePrimaria, ChiavePrimaria)
  Griglia.Item[1] = Dato1
  Griglia.Item[2] = Dato2
  Griglia.Item[3] = Dato3
NEXT

La Key della ColumnView va dichiarata, serve internamente a Gambas: ma non è detto che devi per forza poi rimetterla a video, puoi benissimo inserire nella cella 0 un altro dato (attenzione: tu fai una distinzione errata, item[0] contiene ciò che metti nella variabile che io chiamo "Testo", sempre e comunque). Esempio:
Codice: [Seleziona]

FOR i = 1 to Risultato.Count
  Griglia.Add(ChiavePrimaria, Dato1)
  Griglia.Item[1] = Dato2
  Griglia.Item[2] = Dato3
  Griglia.Item[3] = Dato4
NEXT
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #10 il: 10 Gennaio 2009, 10:46:26 »
ok, finalmente ho capito tutte le sfumature.
CV.add("a","b")
CV.item[1] = "c"
CV.item[2] = "d"

print CV.key
> a

print CV.current.text
> b

print CV.item[0]
> b  (item[0] è =  cv.current.text

print CV.item[1]
> c

Offline Fabrizio

  • Gambero
  • **
  • Post: 61
    • Mostra profilo
Re: ColumnView
« Risposta #11 il: 10 Gennaio 2009, 11:03:04 »
aggingo una cosa. Tutti i casini mi sono venuti fuori perchè
1° non conoscevo gli item[]
2° perchè se si fa:
cv.movefirst
print cv.key
>
il risultato è vuoto
mentre se fai:
print cv.item[n]
> xyz

avendo io in origine messo la chiave primaria nella key e la descrizione in item[0], non riuscivo a recuperare la chiave primara per puntare al record.
Ora che mi è tutto chiaro riesco a gestire il tutto molto semplicemente

Grazie della pazienza. Il tuo aiuto è stato fondamentale.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: ColumnView
« Risposta #12 il: 10 Gennaio 2009, 18:30:21 »
L'utilizzo di "key" vale solo per le Collection, e solo in un ciclo FOR...NEXT.

  • Visitatore
Re: ColumnView
« Risposta #13 il: 16 Maggio 2009, 16:30:26 »
Ma è normale che l'evento doubleclick sia considerato anche click-ando sulle scroll-bars ??????? E' un casino così ... come posso evitarlo ???

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: ColumnView
« Risposta #14 il: 18 Maggio 2009, 20:46:15 »
Perchè sono in effetti due click, uno di seguito l'altro, con tempi stabiliti dalle impostazioni dell'interfaccia grafica (ovvero DM).

Per il controllo al momento non sò che dirti, forse devi attendere il secondo click, oppure rivedere la logica che utilizza tali eventi, in modo che non faccia cose che interferiscono con i due eventi...