Newsgroup: it.comp.lang.visual-basic
Titolo: S.Grid 2.0 non riesco ad editarla

Mi serve una griglia  dove nelle colonne devo andare a scrivere delle cose.
Ho scaricato la S.Grid 2.0 che penso sia perfetta per quello che voglio fare
ma non riesco ad editare il testo  nelle celle. Da quel che ho capito si
deve usare il trucco dell'etichetta e usare gli eventi Mouse Down Mouse Up e
magari scrivere una Sub per vedere se quello che vi è stato scritto rispetta
dei determinati requisiti.
Beh! Per farla breve comportandomi da "paracula" ho preso spunto dal codice
che era presente nella S.Grid 2.0 ma quando vado a variare  il testo dentro
una cella il testo che ho variato ritorna ad essere quello di prima.
Effettuando il debug ho notato che l'anomalia avviene nella Private Sub
grdThis_RequestEdit e per l'esattezza in questo punto di codice
   ' Get the text:
   If Not IsMissing(grdThis.CellText(lRow, lCol)) Then
      sText = grdThis.CellFormattedText(lRow, lCol)   '[*1*]
   Else
      sText = ""
   End If
   ' If the user has initiated edit mode by a key, we want
   ' to add this to the text.  This is really a common
   ' thing and should probably be supported automatically
   ' in the grid:
   If Not (iKeyAscii = 0) Then
      sText = Chr$(iKeyAscii) & sText
      txtEdit.Text = sText
      txtEdit.SelStart = 1
      txtEdit.SelLength = Len(sText)
   Else
      txtEdit.Text = sText   <----------------
      txtEdit.SelStart = 0
      txtEdit.SelLength = Len(sText)
   End If
Nel punto  '[*1*] se io nella cella scrivo PROVA sText non è uguale a PROVA
ma mi torna ad essere quello che avevo scritto in precedenza ( ossia prima
di provare ad editare) e non riesco a capire il perchè.
Allora ho pensato che avessi sbagliato qualcosa nel caricamento  ma andando
a controllarlo non noto nulla di anomalo anche se non ho ancora capito il
perchè dell'esistenza di alcune variabili.... ( è la prima volta che usa una
griglia)
____________________________________________________________
Private Sub addData()
Dim lRow As Long, lCol As Long, lIndent As Long
   Dim sFnt2 As New StdFont
   sFnt2.Name = "Times New Roman"
   sFnt2.Bold = True
   sFnt2.Size = 12
   With grdThis
      .Redraw = False
      .Rows = CLng(5)
      Max = .Rows
      Dim lPARTCol As Long
      Dim lARRIVOCol As Long
      Dim lINIZIOCol As Long
      Dim lFINECOL As Long
      On Error Resume Next
      lPARTCol = .ColumnIndex("PART")
      lARRIVOCol = .ColumnIndex("ARRIVO")
      lINIZIOCol = .ColumnIndex("INIZIO")
      lFINECOL = .ColumnIndex("FINE")
      On Error GoTo 0
      For lRow = 1 To .Rows
         .RowHeight(lRow) = .DefaultRowHeight
             For lCol = 1 To .Columns
                ElseIf (lCol = lPARTCol) Then
                   .CellDetails lRow, lCol, ""
                ElseIf (lCol = lARRIVOCol) Then
                   .CellDetails lRow, lCol, ""
                ElseIf (lCol = lINIZIOCol) Then
                   .CellDetails lRow, lCol, ""
                ElseIf (lCol = lFINECOL) Then
                   .CellDetails lRow, lCol, ""
                End If
           Next lCol
      Next lRow
      Value = 0
      .Redraw = True
   End With
End Sub
___________________________________________________-
Se sapete dove sbaglio mi potete dare un aiutino?
Grazie smack
Debby -----)@

Ho notato questa cosa:
Inizialmente le celle sono vuote.
Ci clicco sopra e scrivo "Ciao" e poi mi sposto....  Ecco gli eventi che
avvengono:
1] - grdThisMouse_Down
              Rendo la griglia editabile ( grdThis.Editable = True e poi
grdThis.SingleClick=True)
2] - grdThis_SelectionChange
        Status = "Selected: " & lRow & "," & lCol
                Passo alla Property LET Status il valore : Selected con le
riga e la colonna della cella scelta
3] -  grdThis_RequestEdit
            Questa Sub fa cose diverse ( per capire il funzionamento ho
preso la Sub originale di S.Grid2.0)
                1] -
                2] -  grdThis.CellBoundary lRow, lCol, lLeft, lTop, lWidth,
lHeight
                        Prende i confini della cella in questione
                3] - If Not IsMissing(grdThis.CellText(lRow, lCol)) Then
                              sText = grdThis.CellFormattedText(lRow, lCol)
                       Else
                              sText = ""
                       End If
                        AIUTO!!! Questa dovrebbe dare il valore scritto
nella cella alla variabile sText nel caso
                        ci fosse scritto qualcosa giusto. In caso contrario
la stringa è nulla
                4] - If Not (iKeyAscii = 0) Then
                              sText = Chr$(iKeyAscii) & sText
                              txtEdit.Text = sText
                              txtEdit.SelStart = 1
                              txtEdit.SelLength = Len(sText)
                       Else
                              txtEdit.Text = sText
                              txtEdit.SelStart = 0
                              txtEdit.SelLength = Len(sText)
                       End If
                        [continua]
                        NON HO IDEA COSA VOGLIA SIGNIFICARE iKeyAscii=0 il
resto lo so
                        ma non riesco a capire dove e perchè perdo il valore
scritto e ritorna il valore
                        che era scritto precedentemente.
 Non scrivo oltre perchè è inutile non riesco a trovare con il debug il
punto dove perdo quello che
avevo scritto nella cella  ufffffffffffffffffff

>                         NON HO IDEA COSA VOGLIA SIGNIFICARE iKeyAscii=0
       è il valore ASCII del tasto premuto sulla tastiera, se =0 nessun
tasto
Ti posso dire questo a proposito della sgrid2:
    Tutto si basa su questi eventi
    1)  RequestEdit che viene chiamato quando fai doppio click col mouse in
una cella o quando premi un tasto, a questo punto gestisci la cosa come
vuoi, controllando il tasto premuto e se entrare o no in modalità di edit o
no settando il parametro dell' evento bCancel su true o  false
    2)cancelEdit che viene chiamato quando la cella cambia o perde il focus,
e si utilizza per nascondere la text
Il fatto che perdi il testo è perchè devi gestire l'assegnazione negli
eventi della textbox, quindi in caso di Enter assegni il valore alla
griglia, in caso di ESC o perdita del focus della textbox lasci tutto
invariato .
Esempio:
(vgridTest = sGrid2)
(txtEdit = Textbox)
Private Sub txtEdit_KeyDown(KeyCode As Integer, Shift As Integer)
    If (KeyCode = vbKeyReturn) Then
        ' Applica le modifiche se tutto va bene
        vgrdTest.CellText(vgrdTest.SelectedRow, vgrdTest.SelectedCol) =
txtEdit.Text
        'Nasconde la textbox
        txtEdit.Visible = False
    ElseIf (KeyCode = vbKeyEscape) Then
        txtEdit.Visible = False
        KeyCode = 0
        ' Cancel edit viene chiamato indirettamente
        'vgrdTest.SetFocus
    End If
End Sub
Private Sub txtEdit_LostFocus()
   vgrdTest.CancelEdit
End Sub
Saluti
GC

                         che era scritto precedentemente.
Di solito ikeyascii contiene il carattere digitato sulla griglia, non so 
  quando sia zero. In ogni caso il codice qui sopra mette nella textbox 
quel che c'era nella cella aggiungendo eventualmente a sinistra (perche' 
a sinistra? io scriverei sText = sText & Chr$(iKeyAscii) ) il carattere 
appena digitato.
Infine valgono le indicazioni che ti sono gia' state date nel thread.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 b. inserisci nel tuo controllo il valore presente nella cella.
In poche parole dimmi se ho capito il funzionamento
Cliccando su un cella di una S.Grid prima si deve capire quale cella è, una
volta capita si rende visibile l'etichetta nell'area
cliccata; quello che viene scritto nell'etichetta poi viene passato alla
cella in questione mentre l'etichetta diventa invisibile e si
svuota.
E' questa la logica?
Sicuramente nell'articolo che emmex mi ha postato ci sarà scritto ma in
inglese non sono bravissima.
Cmq lavorare con il debug è un bordello perchè se clicco su una cella
scattano questi eventi
Mouse_Down
GrdSelectionChange
ma la cosa strana è che se clicco di nuovo sulla stessa cella la seconda
volta io mi aspetto gli stessi eventi e invece
gli eventi cambiano in
Mouse_Down
grdThis_RequestEdi
Mouse_Up
a questo punto la cella è diventata editabile e scrivo dentro qualcosa ma
appena premo un tasto scatta l'evento
txtEdit_KeyDow
purtroppo non posso andare avanti con il debug perchè da qui in poi l'unico
evento che vedo è quest'ultimo e tra
l'altro i tasti premuti non appaiono nella cella.
Per chiudere il mio problema anche leggendo, copiando, spiando ( e chi più
ne ha più ne metta)  il vostro codice rimane
che non appena lascio la cella dove ho scritto qualcosa, il valore della
cella torna ad essere quello che avevo caricato prima
e siccome il debug ha un comportamento strano non riesco a capire quale sia
A) La Sub maledetta B) La Riga da cambiare.
Devo scappare e spero di poter leggervi stasera se no se ne parla Lunedi...
Vi chiederete: Parto? No ho il ragazzo rompi che
odia ogni cosa che si attacchi alla corrente... quasi quasi era meglio che
andava alla Fattoria della Bignardi, li si sarebbe trovato
a suo agio
Debby ----)@

 End Sub
Ho provato a modificare quello che avevo scritto con quello che tu mi hai
postato ma il risultato è lo stesso, non appena lascio
la cella dove ho editato la cella ritorna ad avere il valore precendente.
Devo dire che ogni cosa di nuovo che si fa con VB è una sfida...spero sia
stato cosi anche per voi.. Non oso pensare cosa succederà quando
arriverò ad implementare il mio progetto con lo storage in DB
Uff che pillola però eh!
Deb


Attenzione che questo codice è valido solo se tu confermi con invio quanto
hai scritto nella textbox che ti funziona da editor, se tu abbandoni la
textbox tramite TAB o cliccando con il mouse va modificato il codice.

 
Forse ho capito cosa ti sfugge:
il passaggio del testo dal textbox alla cella non avviene 
automaticamente. Devi essere tu a dare una logica. Pensa ad excel, 
quando premi invio, oppure le frecce, o clicchi su un'altra cella il 
focus si sposta e la cella precedente viene lasciata col contenuto che 
tu hai appena editato.
Se stai inserendo del testo in un textbox devi quindi prevedere che la 
pressione del tasto Invio o Tab o frecce vengano intercettata 
nelle'evento KeyDown:
Private Sub txtEdit_KeyDown(KeyCode As Integer, Shift As Integer)
Select case KeyCode
    case vbKeyReturn
     .CellDetails .SelectedRow, .SelectedCol, txtEdit.Text
...
end select
Nell'evento lostFocus del textedit devi altresi' prevedere cosa deve 
accadere, io di solito ci metto:
vbalGrid1.CancelEdit
E cosi' via...
Se studi l'esempio di cui ti ho postato il link, c'e' anche il codice 
per fare la validazione del contenuto della TextBox prima che venga 
effettivamente inserita nella cella.
ciao
	maxx
P.S. Nel fare il debug non puoi pensare di eseguire tutto passo passo.
Devi avere almeno una idea vaga del concatenersi degli eventi, poi per 
approssimazioni successive ti avvicini alla riga di codice che causa 
problemi.
Il tuo non e' certamente il piu' difficile dei casi da debuggare.
