Capitolo 48. MioGrid                                                                                                                                                                                                                            48.1 Costruzione 

Nei vari Esercizi fin qui visti il DataGrid si comporta egregiamente ma presenta sempre alcune limitazioni per esempio la impossibilita' di presentare dei colori diversi nelle varie celle se, per esempio, un certo valore supera o meno un valore di confronto e ancora la impossibilita' di presentare celle o righe di colore diverso, per esempio alternato  per una migliore visibilita'etc.

Ci proponiamo allora di sviluppare un metodo che possa dare un risultato per esempio come questo, con righe di colore alternato e con i valori dello Stock in rosso se sono al di sotto di un certo valore, diciamo 20:

Per sviluppare l'Esercizio, creeremo come al solito una nuova Cartella all’interno della Cartella GRIGLIE_ADO, la ESERCIZIO_45_ADO_MioGrid. L'Esrcizio e' risolto nella Cartella SOLUZIONE_45_ADO_MioGRid. Partiremo come base dall'Esercizio 10 presentato nei Capitoli 7-8-9-10 per cui possiamo fare un copy di tutti gli elementi della Cartella ESERCIZIO_10_ADO dentro la ESERCIZIO_45_ADO_MioGrid.

I dati ("MAGFILE.MDB") sono come al solito nella cartella "ARCHIVIODATI" a sua volta contenuta in "C:\GRIGLIE_ADO"

Iniziamo con un obiettivo semplice per meglio cercare di spiegare il metodo:  realizzare un MioGrid a due Columns e sei Rows.

Cominciamo allora con l' "ARTSK1".  Portiamo il Font a Grassetto, per migliore visibilita' ed eliminiamo il DataGrid nonche' il Frame di scelta Ordinamenti. Eliminiamo anche il Bottone Ordinamenti perche' realizzeremo questa opzione in altro modo.

Aggiungiamo al Form i seguenti oggetti:

1. Una Shape rettangolare, Shape1

2 Una matrice di bottoncini senza Caption a nome "bSelet(0)", (1),..(6), tanti quanti le Row + 1.

3. Una pila composta da un matrice di bottoni "Header(1)" ed una matrici di caselle di testo con tanti elementi quanto sono le Row: Cell1(1), (2),...(6)

4. Una seconda pila ottenuta copiando la precedente e cambiando l'indice dell' "Header" a 2 e il nome delle caselle di testo a Cell2, ottenendo anche qui  una seconda matrice con indici da 1 a 6 : Cell2(1), (2)...(6).

5. una VScoll1

6. Per finire una matrice di quattro bottoncini a nome "bCol(1), (2), (3), (4) con Caption "+" e "-" , come indicato nella figura sottostante, che verranno utilizzati per allargare e restringere la colonne, dato che il MioGrid non dispone di ScrollBar orizzontale ne' della possibilita' di allargare le colonne col mouse.
 

Si noti che non e' necessario che questi oggetti siano perfettamente allineati perche' a questo provvederemo con il codice.
Passiamo ora appunto al Codice. Cominciamo con il "Modulo1" a cui aggiungeremo alle definizioni di Global gia' presenti anche le seguenti, necessarie per il Progetto:

'Global MioGrid
'--------------------
Global Marka
Global colw1
Global colw2

Global MioTop
Global Mioleft
Global MioHeight
Global MioCol
Global MioRow

Global mRec
Global mValue
Global Selezionato
 

Vedremo di seguito l'utilizzo di queste variabili. Passiamo ora al "FORM_LOAD". Le istruzioni per connettersi al Database rimangono le stesse ma vanno eliminati i riferimenti al DataGrid1 ed aggiunte alcune istruzioni specifiche del MioGrid. Ecco il risultato:

Sub Form_Load()

'apertura progetto
'--------------------
apriprogetto

'Connessione
'---------------------
Cn.CursorLocation = adUseClient
Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _
"Data Source=" & pathmdb

'definizione del Recordset
'---------------------
Selezione = "Select * from ARTFILE order by ARTCODI"
art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

'file vuoto
'---------------------
If art11.BOF Then
artvuoto = True
butfalse
cmdExit.Enabled = True
cmdNew.Enabled = True
Else
artvuoto = False
End If

'posizione
'--------------------
MioTop = 700
Mioleft = 1500
MioHeight = 350

MioCol = 2
MioRow = 6

colw1 = 900
colw2 = 2000

'Vscroll1.max
'----------------------
VScroll1.Max = 100
VScroll1.Value = 0
mRec = art11.RecordCount
mValue = 0

'tabella vuota
'-----------------
If Not art11.BOF Then
art11.MoveFirst
Marka = art11.Bookmark
Else
Artsk1.Visible = False
cmdnew_Click
Exit Sub
End If

'lancio
'---------------------------------
preparaGrid
caricaGrid

End Sub

Come si vede, si definiscono le coordinate dell'angolo sinistro in alto (Top e Left) del MioGrid, nonche' l'altezza desiderata delle Rows e la larghezza desiderata delle Columns. Si inizializzano inoltre il VScroll1 fissandone il valore "MAX" pari 100 ed una variabile "mValue" destinata a ricordare la posizione della "VSCROLL1". Si calcola poi il numero totale di records del RecordSet, nel nostro caso "ART11".

Viene anche identificata una "etichetta", "MARKA", che identifica il record della prima Row. All'inizio, salvo il caso di Tabella "ARTFILE" vuota, questo Record e' il primo e "MARKA" prende il valore del suo BookMark.

Vediamo ora la Subroutine che, in base ai valori scelti, allinea e posizione ordinatamente tutti gli oggetti componenti il MioGrid:

Sub preparaGrid()

'top MioGrid
'--------------
bSelet(0).Top = MioTop

'bSelettori
'-------------------
For i = 1 To MioRow
bSelet(i).Top = bSelet(0).Top + i * MioHeight
Next

For i = 0 To MioRow
bSelet(i).Height = MioHeight
Next

For i = 0 To MioRow
bSelet(i).Left = Mioleft
Next

'headers
'-------------------
For i = 1 To MioCol
Header(i).Top = MioTop
Next

For i = 1 To MioCol
Header(i).Height = MioHeight
Next

Header(1).Width = colw1
Header(1).Left = bSelet(0).Left + bSelet(0).Width
Header(1).Caption = "Code"

Header(2).Width = colw2
Header(2).Left = Header(1).Left + colw1
Header(2).Caption = "Descrizione"

'celle
'------------------
For i = 1 To MioRow
Cell1(i).Top = bSelet(i).Top
Cell1(i).Height = MioHeight + 3
Next

For i = 1 To MioRow
Cell2(i).Top = bSelet(i).Top
Cell2(i).Height = MioHeight + 3
Next

'bottoni incremento
'------------------
bCol(1).Top = Cell1(6).Top + Cell1(6).Height + 100
For i = 2 To MioCol * 2
bCol(i).Top = bCol(1).Top
Next

bCol(1).Left = Mioleft + colw1 / 2 - 150
bCol(2).Left = bCol(1).Left + bCol(1).Width + 5

bCol(3).Left = Mioleft + colw1 + colw2 / 2 - 150
bCol(4).Left = bCol(3).Left + bCol(4).Width + 5

'VScroll1
'-----------------
VScroll1.Top = MioTop
VScroll1.Height = MioRow * MioHeight + MioHeight
VScroll1.Left = Mioleft + bSelet(1).Width + colw1 + colw2  + 10

'shape1
'---------------
Shape1.Top = MioTop - 20
Shape1.Left = Mioleft - 20
Shape1.Height = MioHeight * (MioRow + 2) + 120
Shape1.Width = bSelet(0).Width + colw1 + colw2 + VScroll1.Width + 30

End Sub

Passiamo ora all Subroutine che carica i valori delle sei Rows, cuascuna  di due colonne, cioe' di due matrici di Celle:

Sub caricaGrid()

art11.Bookmark=Marka
scorta = 20

'1a row
'---------------------------------
Cell1(1).Left = bSelet(1).Left + bSelet(1).Width
Cell1(1).Width = colw1
Cell1(1).Alignment = 1

Cell2(1).Left = Cell1(1).Left + colw1
Cell2(1).Width = colw2
Cell2(1).Alignment = 0
'---
If Not art11.EOF Then
Cell1(1) = CStr(art11("ARTCODI") & "")
Cell2(1) = CStr(art11("ARTNOME") & "")
Else
Exit Sub
End If

'2a row
'---------------------------------
Cell1(2).Left = bSelet(2).Left + bSelet(2).Width
Cell1(2).Width = colw1
Cell1(2).Alignment = 1

Cell2(2).Left = Cell1(2).Left + colw1
Cell2(2).Width = colw2
Cell2(2).Alignment = 0
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(2) = CStr(art11("ARTCODI") & "")
Cell2(2) = CStr(art11("ARTNOME") & "")
Else
art11.MoveLast
End If

'3a row
'---------------------------------
Cell1(3).Left = bSelet(3).Left + bSelet(3).Width
Cell1(3).Width = colw1
Cell1(3).Alignment = 1

Cell2(3).Left = Cell1(3).Left + colw1
Cell2(3).Width = colw2
Cell2(3).Alignment = 0
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(3) = CStr(art11("ARTCODI") & "")
Cell2(3) = CStr(art11("ARTNOME") & "")
Else
art11.MoveLast
End If

'4a row
'---------------------------------
Cell1(4).Left = bSelet(4).Left + bSelet(4).Width
Cell1(4).Width = colw1
Cell1(4).Alignment = 1

Cell2(4).Left = Cell1(4).Left + colw1
Cell2(4).Width = colw2
Cell2(4).Alignment = 0
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(4) = CStr(art11("ARTCODI") & "")
Cell2(4) = CStr(art11("ARTNOME") & "")
Else
art11.MoveLast
End If

'5a row
'---------------------------------
Cell1(5).Left = bSelet(5).Left + bSelet(5).Width
Cell1(5).Width = colw1
Cell1(5).Alignment = 1

Cell2(5).Left = Cell1(5).Left + colw1
Cell2(5).Width = colw2
Cell2(5).Alignment = 0
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(5) = CStr(art11("ARTCODI") & "")
Cell2(5) = CStr(art11("ARTNOME") & "")
Else
art11.MoveLast
End If

'6a row
'---------------------------------
Cell1(6).Left = bSelet(6).Left + bSelet(6).Width
Cell1(6).Width = colw1
Cell1(6).Alignment = 1

Cell2(6).Left = Cell1(6).Left + colw1
Cell2(6).Width = colw2
Cell2(6).Alignment = 0
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(6) = CStr(art11("ARTCODI") & "")
Cell2(6) = CStr(art11("ARTNOME") & "")
Else
art11.MoveLast
End If

End Sub

Come si vede, ci si colloca sul Record con etichetta/BookMark  "MARKA", e per la prima  Row si definiscono i valori delle due matrici  "CELL1"  e "CELL2" relativamente all'indice 1. Se la Tabella non e' vuota (BOF/EOF) si scrivono i valori dei due campi che si vogliono mostrare, "ARTCODI" ed "ARTNOME".  Dopdiche' si passa alla Row successiva, cioe' al record successivo e, dopo conferma che non si sia finiti in "EOF",  si definiscono i valori delle stesse matrici pero' adesso con indice 2 e cosi' via fino alla sesta riga, cioe' al valore fissato di "MIOROW". Se i records disponibili sono finiti (EOF) si va all'ultimo Record del Recordset.

Lanciando il Programma si ottiene questo risultato:

Se i Records della Tabella "ARTFILE" sono pochi (meno di "MioRow") il MioGrid avra' questo aspetto, con le ultime righe vuote e blank.

Se poi la Tabella e' completamente vuota (BOF), al primo lancio si attiva il bottone "CMDNEW" di "ARTSK1" come indicato nel "FORM_LOAD" qui sopra e si chiede all'utente di inserire il primo Record.

 48.2 I Bottoni Selettori 

Quando si preme un bottone selettore occorre che la riga prescelta inverta i colori e che il recordset si posizioni sul record indicato. A questo provvede la seguente Subroutine:

Sub bSelet_Click(Index As Integer)

'tabella vuota
'-----------------
If art11.BOF Then
Exit Sub
End If

'tabella non vuota
'-----------------
ripristinaGrid
Selezionato = Index

'cambia colori
'-----------------
Cell1(Index).BackColor = vbBlack
Cell1(Index).ForeColor = vbWhite

Cell2(Index).BackColor = vbBlack
Cell2(Index).ForeColor = vbWhite

'posiziona
'-----------------
art11.Bookmark = Marka
For i = 1 To Index - 1
art11.MoveNext
If art11.EOF Then
Selezionato = 0
ripristinaGrid
Exit Sub
End If
Next

End Sub

Si noti il blocchetto di posizionamento: se i Records sono pochi (meno di MioRow) e quindi ci sono delle Rows blank, se si batte sul bottone selettore di una Row blank, questo non reagisce, cioe' non seleziona nessun Record.

Accanto alla Routine di selezionamento occorre anche preparare una (contro)routine che elimini la eventuale vecchia riga evidenziata (che puo' trovarsi in una qualunque delle sei Rows) , prima di evidenziarne un'alra o quando si muove il VScroll. Ecco questa routine:

Sub ripristinaGrid()

Selezionato = 0

For i = 1 To MioRow
Cell1(i).BackColor = vbWhite
Cell1(i).ForeColor = vbBlack
Next

For i = 1 To MioRow
Cell2(i).BackColor = vbWhite
Cell2(i).ForeColor = vbBlack
Next

End Sub

 48.3 Vertical Scroll 

Il motore di movimento del MioGrid e' la barra verticale. Ecco la routine per l'Evento Change:

Private Sub VScroll1_Change()

ripristinaGrid

'vuoto
'--------------------
If art11.BOF Then
Exit Sub
End If

'top
'--------------------
If VScroll1.Value = 0 Then
art11.MoveFirst
Marka = art11.Bookmark
mValue = VScroll1.Value
caricaGrid
Exit Sub
End If

'+1
'--------------------
If (VScroll1.Value = mValue + 1) And (art11.EOF = False) Then

'verifica
'---
art11.Bookmark = Marka
sipuo = True
For i = 1 To MioRow
art11.MoveNext
If art11.EOF Then
sipuo = False
art11.MovePrevious
End If
Next
'---
If sipuo = False Then
'-
For i = 1 To MioRow
Cell1(i).Text = ""
Cell2(i).Text = ""
Cell3(i).Text = ""
Next
'-
End If 'sipuo False
'---
art11.Bookmark = Marka
art11.MoveNext
If Not art11.EOF Then
Marka = art11.Bookmark
End If
mValue = VScroll1.Value
caricaGrid
Exit Sub

End If '+1

'-1
'--------------------
If (VScroll1.Value = mValue - 1) And (art11.BOF = False) Then

art11.Bookmark = Marka
art11.MovePrevious
'---
If art11.BOF = True Then
art11.MoveFirst
End If
'---
Marka = art11.Bookmark
mValue = VScroll1.Value
caricaGrid
Exit Sub

End If '-1

'Cursore
'--------------------
pos = (VScroll1.Value * mRec) / 100
If pos = 0 Then 'tabella vuota
Artsk1.Show
Exit Sub
ElseIf (pos < 1) Then
pos = 1
End If
art11.AbsolutePosition = pos

'verifica
'---
Marka = art11.Bookmark
sipuo = True
For i = 1 To MioRow
art11.MoveNext
If art11.EOF Then
sipuo = False
art11.MovePrevious
End If
Next
'---
If sipuo = False Then
'-
For i = 1 To MioRow
Cell1(i).Text = ""
Cell2(i).Text = ""
Cell3(i).Text = ""
Next
'-
End If 'sipuo False
'---
art11.Bookmark = Marka
art11.MoveNext
If Not art11.EOF Then
Marka = art11.Bookmark
End If
mValue = VScroll1.Value
caricaGrid

End Sub

Come si vede, in caso di incremento +1/-1 con pulsante si passa al Record successivo o precedente, si fissa il nuovo valore do "MARKA" e si lancia il "CARICAGRID". Per spostamenti piu' ampi (cursore verticale) si fa un calcolo approssimato della posizione a cui ci si vuole trasferire nel Recordset calcolando la percentuale della nuova posizione rispetto al numero totale di Records. In ogni caso il Record con BookMark "MARKA" deve essere almeno 6 (MioRow) records prima dell'ultimo

48.4 Frecce e PgUp/PgDown

Se il Focus e' sul VScroll1 si possono anche attivare i tasti freccia su e giu' nonche' i tasti PgUp e PgDwn. Pertanto conviene assegnare valore zero al Tabindex del VScroll1 in modo che questa opzione sia attiva al primo avvio del programma. Ecco la routine:

Private Sub VScroll1_KeyDown(KeyCode As Integer, Shift As Integer)

Select Case mRec
Case Is < 100
salto = Int(mRec / 10)
Case Is < 1000
salto = Int(mRec / 100)
Case Else
salto = Int(mRec / 1000)
End Select

Select Case KeyCode
Case 34 'VK_PGDOWN
'===============================================
If VScroll1.Value < VScroll1.Max - salto Then
VScroll1.Value = VScroll1.Value + salto
Else
VScroll1.Value = VScroll1.Max
art11.MoveLast
End If
mValue = VScroll1.Value

Case 33 'VK_PGUP
'===============================================
If VScroll1.Value > salto Then
VScroll1.Value = VScroll1.Value - salto
Else
VScroll1.Value = 0
art11.MoveFirst
End If
mValue = VScroll1.Value

Case 40 'VK_DOWN
'===============================================
If mValue = 0 Then
art11.MovePrevious
VScroll1.Value = 0
VScroll1.Value = VScroll1.Value + 1
End If

Case 38 'VK_UP
'===============================================
If mValue = VScroll1.Max Then
art11.MoveNext
VScroll1.Value = VScroll1.Max
VScroll1.Value = VScroll1.Value - 1
End If

End Select
'===============================================

If art11.EOF Then
art11.MoveLast
ElseIf art11.BOF Then
art11.MoveFirst
End If

End Sub

Si noti che quando si smette di usare la VScroll1 e si batte un bottone selettore, il Focus non e' piu' sulla barra verticale. Se pero' si e' avuto l'accortezza di assegnare valore 1, 2, 3..6 alle Proprieta' Tabindex dei bottoni, le frecce funzionano ancora su questi bottoni e premendoli si puo' cambiare il Record prescelto.

 48.5 Bottoni di Incremento

I bottoni "BCOL" , una matrice da 1 a MioCol *2, cioe' una coppia per ogni colonna,  permettono di allargare e restringere le dimensioni delle colonne con incrementi, per esempio, di 100 pixels. Ecco la routine:

Private Sub bCol_Click(Index As Integer)

Select Case Index

Case 1
colw1 = colw1 - 100
art11.MoveFirst
Case 2
colw1 = colw1 + 100
art11.MoveFirst

Case 3
colw2 = colw2 - 100
art11.MoveFirst
Case 4
colw2 = colw2 + 100
art11.MoveFirst

End Select

'lancio
'------------
preparaGrid
caricaGrid

End Sub

  48.6 Ordinamento 

Si puo' modificare l'ordinamento del Recordset agendo sui bottoni Headers. Ecco la routina:

Private Sub Header_Click(Index As Integer)

'ordina
'--------------
Select Case Index
Case 1
Selezione = "Select * from ARTFILE order by ARTCODI"
art11.Close
art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

Case 2
Selezione = "Select * from ARTFILE order by ARTNOME,ARTCODI"
art11.Close
art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

End Select

'posiziona
'-------------
mValue = 0
VScroll1.Value = 0
art11.MoveFirst
ripristinaGrid
caricaGrid

End Sub

 48.7 Aggiunta di una Colonna

Se si desidera aggiungere una nuova colonna al nostro MioGrid occorre operare come segue:

1. Costruzione
a) aggiungere una pila che comprende celle, header e bottoni incremento copiandola da una esistente
b) cambiare l'indice del nuovo Header es da 0 ->3 . Per le Celle cambiare il nome es da Cell1 a Cell3 e gli indici da 0 a 6 (MioRow).
c) cambiare gli indici ai bottoni di incremento. es da 0 -> 5 e 6

2. Form Load
a) Modificare il valore di MioCol es da 2 -> 3
b) Aggiungere la nuova colw. es colw3=1000

3. Sub preparagrid
a) aggiungere un header. es Header(3) e aggiustare i colw
b) aggiungere i Left dei due bottoni di incremento compresa la aggiunta di. es colw3
c) aggiungere Top ed Height di una Cella
d) correggere Left del Vscroll1 aggiungendo nuova colonna. es colw3
e) correggere width del shape 1 aggiungendo nuova colonna. es colw3

4. Sub caricagrid
a) aggiungere alla prima Row un nuovo pecchetto relativo a Cell3(1)  ed aggiustarlo
b) (se necessario aggiungere a questa nuova Cell eventuali if oppure Format)
c) copiare questo pacchetto per le altre row cambiando l'indice. es (1) -> (2) etc.

5. Evento Click bottoni incremento
a) agiiungere due "Case". es 5 e 6

Veduamo di commentare queste operazioni.

Con l'operazione 1.a) si ottiene un Form cosi' modificato:


Qui si possono cambiare i nome e gli indici dei nuovi oggetti, come da 1.b) e 1.c). I bottoni di incremento saranno "BCOL(5)" e "BCOL(6).

Interveniamo ora nel Form_Load come da istruzioni 2.a) e 2.b):

'posizione
'--------------------
MioTop = 700
Mioleft = 1500
MioHeight = 350

MioCol = 3
MioRow = 6

colw1 = 900
colw2 = 2000
colw3 = 1000

Lo step 3.a) prescrive di aggiungere un nuovo Header in "PREPARAGRID". Decidiamo che vogliamo mostrare una colonna di "STOCK" del Recordset "art11". Ecco le istruzioni:

Header(3).Width = colw3
Header(3).Left = Header(2).Left + colw2
Header(3).Caption = "Stock"

Come da istruzione 3.b) aggiungiamo i Left dei due bottoni di incremento:

bCol(5).Left = Mioleft + colw1 + colw2 + colw3 / 2 - 150
bCol(6).Left = bCol(5).Left + bCol(6).Width + 5

Come da istruzione 3.c) aggiungiamo la nuova matrice Cell3:

For i = 1 To MioRow
Cell3(i).Top = bSelet(i).Top
Cell3(i).Height = MioHeight + 3
Next

Ora modifichiamo i Left di VScroll1 e dello Shape1 come da istruzioni 3.d) e 3.e):

'VScroll1
'-----------------
VScroll1.Top = MioTop
VScroll1.Height = MioRow * MioHeight + MioHeight
VScroll1.Left = Mioleft + bSelet(1).Width + colw1 + colw2 + colw3 + 10

'shape1
'---------------
Shape1.Top = MioTop - 20
Shape1.Left = Mioleft - 20
Shape1.Height = MioHeight * (MioRow + 2) + 120
Shape1.Width = bSelet(0).Width + colw1 + colw2 + colw3 + VScroll1.Width + 30

Operiamo ora in accordo a 4.a) ed aggiungiamo in "CARICAGRID" le istruzioni relative all'elemento Cell3(1):

Cell3(1) = Format(Cell3(1), "# ###.0")
Cell3(1).Left = Cell2(1).Left + colw2
Cell3(1).Width = colw3
Cell3(1).Alignment = 1
'---
If Not art11.BOF Then
Cell1(1) = CStr(art11("ARTCODI") & "")
Cell2(1) = CStr(art11("ARTNOME") & "")
Cell3(1) = CStr(art11("STOCK") & "")
Cell3(1) = Format(Cell3(1), "# ###.0")
If art11!STOCK < scorta Then
Cell3(1).ForeColor = vbRed
End If
Else
Exit Sub
End If

Come si vede, in accordo con 4.b) qui abbiamo definito il Format di Cell3 per personalizzare l'aspetto di "STOCK" (una cifra decimale) ed abbiamo definito che in caso "STOCK" sia inferore al valore "SCORTA" (definito sopra uguale a 20 tanto per fare un esempio) la cella prenda un ForeColor rosso.

Copiamo ora questo blocchetto per tutte le successive Row cambiando solo "(1)" con "(2)" etc. Ecco un esempio per la seconda Row:

'2a row
'---------------------------------
Cell1(2).Left = bSelet(2).Left + bSelet(2).Width
Cell1(2).Width = colw1
Cell1(2).Alignment = 1

Cell2(2).Left = Cell1(2).Left + colw1
Cell2(2).Width = colw2
Cell2(2).Alignment = 0

Cell3(2).Left = Cell2(2).Left + colw2
Cell3(2).Width = colw3
Cell3(2).Alignment = 1
'---
art11.MoveNext
If Not art11.EOF Then
Cell1(2) = CStr(art11("ARTCODI") & "")
Cell2(2) = CStr(art11("ARTNOME") & "")
Cell3(2) = CStr(art11("STOCK") & "")
Cell3(2) = Format(Cell3(2), "# ###.0")
If art11!STOCK < scorta Then
Cell3(2).ForeColor = vbRed
End If
Else
art11.MoveLast
End If

Resta solo da sistemare la matrice dei bottoni di incremento, come da 5.a):

Case 5
colw3 = colw3 - 100
art11.MoveFirst
Case 6
colw3 = colw3 + 100
art11.MoveFirst

48.8 Lettura di un Record

Il bottone "CMDREAD" dell'"ARTSK1" resta uguale a quello dell'Esercizio 10, tranne che prima di procedere dobbiamo assicurarci che un record sia stato selezionato. e che il Recordset si tovi puntato sulle selezione. Ecco il frammento:

'mioGrid
'---------------
If Selezionato = 0 Then
titolo = "Attenzione !"
Messaggio = "Selezionare un Record ! "
Stile = vbOKOnly + vbExclamation ' Definisce pulsanti.
Risposta = MsgBox(Messaggio, Stile, titolo)
Exit Sub
End If

'posiziona
'----------------
art11.Bookmark = Marka
For i = 1 To Selezionato - 1
art11.MoveNext
Next

Inoltre vanno eliminati i riferimenti al DataGrid1 in "ARTFRESCA" nel Modulo1:

Sub artfresca()

'memorizza ARTCODI Record
'------------------------------
zartcodi = virvalore(Artsk2.txtartcodi.Text)

'riapre il recordset ADO
'------------------------
art11.Close
art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic
'Set Artsk1.DataGrid1.DataSource = art11
'Artsk1.caricacolonne

'riposiziona
'----------------------
If Not art11.BOF Then
kriterio = "ARTCODI = " & zartcodi & " "
art11.Find kriterio
End If

En
d Sub

Al ritorno da "ARTSK2" occorre rilanciare il "CARICAGRID":

Private Sub cmdritvid_Click()

Artsk1.Enabled = True
Artsk1.caricaGrid
Unload Artsk2

End Sub

48.9 Modifica di un Record

Anche per il bottone "CMDEDIT" in "ARTSK1" bisogna aggiungere lo stesso blocchetto della lettura qui sopra per il controllo della avvenuta selezione.

Inoltre in "ARTSK2" occorre lanciare in "CMDCONFEDIT" le istruzioni necessarie per rinfrescare il MioGrid. Ecco il frammento:

'ritorna a video lista
'---------------------------
Artsk1.Enabled = True
Unload Artsk2

'MioGrid
'----------------------
art11.Bookmark = Marka
Artsk1.caricaGrid

End Sub

Se invece si vuole rinunciare all'operazione si preme il bottone "CMDABANDON" ed anche qui occorre rinfrescare il MioGrid:

Private Sub cmdAbandon_Click()

If cmdConfEdit.Visible = True Or cmdConfDele.Visible = True Then
If Not art11.BOF Then
art11!fliprete = 0
art11.Update
End If
End If

Artsk1.Visible = True
Artsk1.Enabled = True
If Not art11.BOF Then
Artsk1.caricaGrid
End If
Unload Artsk2

End Sub

48.10 Cancellazione di un Record

Anche qui per il bottone "CMDELE" in "ARTSK1" bisogna aggiungere il solito blocchetto per il controllo della avvenuta selezione.

Invece, in "ARTSK2" , dopo la confermata cancellazione, conviene ricaricare il nuovo Recordset (con un record di meno) e ricalcolare tutto. Cio' si ottiene con il rilancio del Form_Load dell' "ARTSK1".

Private Sub cmdconfdele_Click()

'cancella
'-------------------------
art11.Delete
DoEvents

'MioGrid
'-----------------
art11.Close
Cn.Close
For i = 1 To MioRow
Artsk1.Cell1(i) = Space(0)
Artsk1.Cell2(i) = Space(0)
Artsk1.Cell3(i) = Space(0)
Next
Artsk1.Form_Load
Artsk1.ripristinaGrid
If Not art11.BOF Then
Artsk1.caricaGrid
End If
Artsk2.cmdConfDele.Visible = False

'ritorna a video lists
'------------------------
If Not art11.EOF Then
Artsk1.Enabled = True
Unload Artsk2
End If

End Sub

48.11 Aggiunta di un nuovo Record

Qui non serve fare nulla  per il bottone "CMDNEW" in "ARTSK1" . Nell'"ARTSK2" invece, dopo inserimento occorre ricalcolare il nuovo Recordset. Inoltre conviene posizionarsi e selezionare l'ultimo Record che e' quello che con maggiore probabilita' e' stato aggiunto. Ecco il relativo frammento:

'torna a video list
'----------------------------------
artvuoto = False
Artsk1.buttrue
Artsk1.Enabled = True
Unload Artsk2

'MioGrid
'-----------------
art11.Close
Cn.Close
Artsk1.Form_Load

'va all'ultimo
'--------
Artsk1.VScroll1.Value = Artsk1.VScroll1.Max
art11.MoveLast
For i = 1 To MioRow - 1
'--
art11.MovePrevious
If art11.BOF Then
art11.MoveFirst
End If
'--
Next
Marka = art11.Bookmark
Artsk1.Visible = True      'in caso primissimo record aggiunto
Artsk1.caricaGrid

'seleziona ultimo
'--------
If art11.RecordCount > MioRow Then
Artsk1.bSelet_Click (MioRow)
End If 'MioRow
'----------

End Sub

48.12 Parametrazione di CaricaGrid

La Routine "CARICAGRID vista sopra appare complicata ma in realta' e' solo ripetitiva. Cio' suggerisce una semplificazione con l'uso di una opportuna funzione. Ecco la Funzione:

Function funGrid(Par)

'Formatta Celle
'---------------------------------
Cell1(Par).Left = bSelet(Par).Left + bSelet(Par).Width
Cell1(Par).Width = colw1
Cell1(Par).Alignment = 1

Cell2(Par).Left = Cell1(Par).Left + colw1
Cell2(Par).Width = colw2
Cell2(Par).Alignment = 0

Cell3(Par) = Format(Cell3(Par), "# ###.0")
Cell3(Par).Left = Cell2(Par).Left + colw2
Cell3(Par).Width = colw3
Cell3(Par).Alignment = 1

'colore
'----------------------
funColor (Par)

'GoSub campi
'-----------------------
If Par = 1 Then
If Not art11.EOF Then
GoSub campi
End If
'---
Else 'Par
'---
art11.MoveNext
If Not art11.EOF Then
GoSub campi
Else
art11.MoveLast
End If
'---
End If 'Par

Exit Function

'campi
'======================================
campi:
Cell1(Par) = CStr(art11("ARTCODI") & "")
Cell2(Par) = CStr(art11("ARTNOME") & "")
Cell3(Par) = CStr(art11("STOCK") & "")
Cell3(Par) = Format(Cell3(Par), "# ###.0")
If art11!STOCK < scorta Then
Cell3(Par).ForeColor = vbRed
End If

End Function

Disponendo di questa funzione e' facile riscrivere un nuovo, diciamo, "CARICAGRID2":

Sub caricaGrid2()

art11.Bookmark = Marka
scorta = 20

'MioRow
'-------------
funGrid (1)
funGrid (2)
funGrid (3)
funGrid (4)
funGrid (5)
funGrid (6)

End Sub

Per provare questa nuova versione basta rinominare il vecchio "CARICAGRID" ad esempio "X_CARICAGRID" ed il "CARICAGRID2" a "CARICAGRID". Tutto funziona come prima ma con una bella semplificazione del codice. Attenzione alla variabile "SCORTA": dato che ora compare in piu' di una Subroutine va resa pubblica, meglio Global in "MODULO1".

All'niterno del nuovo "CARICAGRID" si puo', opzionalmente, richiamare un'altra funzione se si vuole per esempio ottenere un effetto di colori alternati:

Function funColor(Par)

'colori alternati
'----------------------
Select Case Par
Case 2, 4, 6
Cell1(Par).ForeColor = vbBlack
Cell1(Par).BackColor = &HC0FFFF

Cell2(Par).ForeColor = vbBlack
Cell2(Par).BackColor = &HC0FFFF

Cell3(Par).ForeColor = vbBlack
Cell3(Par).BackColor = &HC0FFFF
End Select

End Function

In altre parole si e' aggiunto per ogni cella interessata la indicazione del colore alternativo: BackColor = &HC0FFFF (nocciola chiaro). L'effetto e' quello mostrato all'inizio di questo Capitolo.

  48.13 Costruzione in .NET

Come noto, questa Opera non approfondisce il VB Express. Tuttavia, visto l'interesse dell'argomento, vogliamo cimentarci in una versione semplificata per vedere come si puo' costruire un MioGrid anche In VB Express. Si ricorda comunque che tutto quanto esporremo qui di seguito presuppone la conoscenza dei concetti esposti ai Capitoli da 1 a 10, a cui si rimanda per riferimento.

Creiamo alora come al solito una nuova Cartella all’interno della Cartella GRIGLIE_ADO, la ESERCIZIO_45_NET_MioGrid. L'Esrcizio e' risolto nella Cartella SOLUZIONE_45_NET_MioGrid. Partiremo come base dall'Esercizio 10 presentato nei Capitoli 7-8-9-10 per cui possiamo fare un copy di tutti gli elementi della Cartella ESERCIZIO_10_NET dentro la ESERCIZIO_45_NET_MioGrid.

Partiamo dall'"ARTSK1" e facciamo piazza pulita di tutti i riferimenti al DataGridView ed alle Routines associate ed eliminiamo anche le funzioni di Ordinamento. Lasciamo solo i bottoni di gestione Record ed aggiungiamo una barra di Scorrimento Verticale a cui naturalmente daremo il nome di "VSCROLL1".

Iniziamo a costruire il MioGrid e, come fatto in VB6, cerchiamo di inserire le matrici di Bottoni Selettori, Headers e Celle TextBox. Qui ci inchiodiamo subito perche' la buona notizia e' che il VB Express ha eliminato le matrici di Comandi.  E allora come si fa ? Semplice, bisogna creare le suddette matrici da codice e queste appariranno magicamente sul Form solo al momento del lancio del Project.

Pertanto il povero Form "ARTSK1" avra' solo questo aspetto (che ricorda un po' Spelacchio):

 

Partiamo col codice: In testa alla Classe "ARTSK1" definiamo le variabili necessarie a MioGrid:

'MioGrid

'---------------------

Dim MioRow = 6

Dim MioCol = 3

 

Dim MioTop = 70

Dim MioLeft = 130

Dim MioHeight = 25

 

Dim bSelet(MioRow)

 

Dim Cell1(MioRow) As TextBox

Dim Cell2(MioRow) As TextBox

Dim Cell3(MioRow) As TextBox

 

Dim colw1 = 60

Dim colw2 = 200

Dim colw3 = 70

 

Dim mValue

Dim Marka

Dim pos

Dim Selezionato

Dim scorta

Dim Ind As Integer

Dim mPosition

 

Il Form Load  e' semplice. Per una piu' ampia descrizione di "APRIPROGETTO" si rimanda al Capitolo 4 e seguenti.

Private Sub Artsk1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

'apertura progetto

'--------------------

apriprogetto()

 

'file vuoto

'---------------------

If MaxRowsArt = 0 Then

artvuoto = True

butfalse()

cmdExit.Enabled = True

cmdNew.Enabled = True

Else

artvuoto = False

End If

 

'label

'-------------------------------------------

lblHeader.Text = "per Codice"

 

'lancia il MioGrid

'----------------------

preparagrid()

caricaGrid()

 

End Sub

 

Iniziamo ora la Routine "PREPARAGRID". Si comincia con un frammento che crea i bottoni selettori:

'Crea bottoni selettori

'-------------------------

Dim bSelet(MioRow) As Button

Dim posx As Integer, posy As Integer

Dim larg As Integer, alt As Integer

Dim Ind As Integer

posx = MioLeft

posy = MioTop

alt = MioHeight - 7

larg = 20

 

For Ind = 0 To MioRow

bSelet(Ind) = New Button

bSelet(Ind).Location = New Point(posx, posy + Ind * alt)

bSelet(Ind).Size = New Size(larg, alt)

bSelet(Ind).TabIndex = Ind

Me.Controls.Add(bSelet(Ind))

AddHandler bSelet(Ind).Click, AddressOf bSelet_Click

Next

 

Come si vede, si definisce una matrice di sei (MioRow=6) elementi cioe' sei Bottoni "bSelet" e se ne definisce la posizione "Left" pari a MioLeft e la posizione Top a scalare da MioTp a  MioTop+ Ind*Mioheight (corretto con un -7 pixels), giu' a scendere. "Ind" e' il contatore del ciclo "For". Anche la Proprieta' "Tabindex" viene scalata da uno a sei come avevamo fatto in VB6.

Nota : C'e' anche un selettore ad indice zero che ha solo scopo estetico. Vedasi la stessa situazione per il MioGrid VB6.

Come si vede sopra, l'evento "Click" di questi bottoni  lancera' la Handler Sub "bSelet_Click" (nome scelto da noi arbitrariamente ma con un occhio al suo uso). Vediamo subito questa Routine, sapendo che il "Click" deve cambiare i colori della riga corrispondente al bottoncino selettore premuto. Eccola:

Public Sub bSelet_Click(ByVal sender As Object, ByVal e As System.EventArgs)

 

'tabella vuota

'-----------------

If MaxRowsArt = 0 Then

Exit Sub

End If

 

'tabella non vuota

'-----------------

ripristinaGrid()

 

'trova indice

'-----------------

Select Case (sender).top

Case MioTop + MioHeight - 7

Ind = 1

Case MioTop + 2 * (MioHeight - 7)

Ind = 2

Case MioTop + 3 * (MioHeight - 7)

Ind = 3

Case MioTop + 4 * (MioHeight - 7)

Ind = 4

Case MioTop + 5 * (MioHeight - 7)

Ind = 5

Case MioTop + 6 * (MioHeight - 7)

Ind = 6

End Select

 

'cambia colori

'-----------------

Cell1(Ind).BackColor = Color.Black

Cell1(Ind).ForeColor = Color.White

Cell2(Ind).BackColor = Color.Black

Cell2(Ind).ForeColor = Color.White

Cell3(Ind).BackColor = Color.Black

Cell3(Ind).ForeColor = Color.White

 

'posiziona

'-----------------

art11.Position = Marka

For i = 1 To Ind - 1

If art11.Position < MaxRowsArt - 1 Then

art11.MoveNext()

Else

Selezionato = 0

ripristinaGrid()

Exit Sub

End If

Next

Selezionato = Ind

End Sub

Commentiamo: sebbene si sia creata una matrice di bottoni non c'e' modo di conoscere l'indice del bottone premuto (un'altra chicca del VB Express). Bisogna per forza trovare una Proprieta' del bottone premuto e riferirsi al  valore di tale Proprieta'. Normalmente viene suggerito di riferirsi alla "Caption" pero' qui i nostri bottoncini ne sono privi. L'unica Proprieta' che li differenzia e' la loro Proprieta' "Top" che si estrae dal sender dell'Evento Click cioe'  la "(sender).Top". Partendo da questa ricostruiamo l'Indice del bottone premuto ed identifichiamolo con nome "Ind".

In altre parole, l'"Ind" del bottoncino e' definito in base al Top del Bottoncino stesso: il primo ha Top= MioTop, come risulta dalla sua costruzione, e gli altri "MioTop+ 2*(MioHeight-7)" eccetera.  A questo punto possiamo procedere a cambiare il colore della Cella che ha lo stesso indice "Ind".

Infatti anche le Celle si costruiscono come matrici con indice da 1 a 6 (MioRow) come in VB6. Vediamo il frammento di "CELL1", prima Colonna:

'Crea Cell1

'-------------------------

posx = MioLeft + bSelet(1).Width

posy = MioTop

alt = MioHeight - 7

larg = colw1

 

For Ind = 1 To MioRow

Cell1(Ind) = New TextBox

Cell1(Ind).Location = New Point(posx, posy + Ind * alt)

Cell1(Ind).Size = New Size(larg, alt)

Me.Controls.Add(Cell1(Ind))

Next

 

Come si vede, la procedura di costruzione della matrice della prima colonna "CELL1(1), (2)...(6)" e' analoga a quanto visto per i bottoni. La proprieta' "Left" li colloca a destra del primo bottone selettore, mentre per la larghezza si assegna "COLW1".

In modo analogo si creano le matrici "CELL2" e "CELL3" corrispondenti alle altre colonne del costruendo "MioGrid".

Passiamo agli Headers. Ecco il primo:

'Crea Header

'-------------------------

Dim Header(MioCol) As Button

 

Header(1) = New Button

Header(1).Location = New Point(MioLeft + bSelet(1).Width, MioTop)

Header(1).Size = New Size(colw1, MioHeight)

Header(1).Text = "Codice"

Me.Controls.Add(Header(1))

AddHandler Header(1).Click, AddressOf Header_Click_1

 

Come da istruzione qui sopra, abbiamo impostato che l'evento "Click" di questo bottone  lanci la Handler Sub "Header_Click_1" (anche qui nome arbitrario ma che ricorda il sender), Routine che vediamo subito, sapendo che il "Click" deve cambiare l'ordine del Recordset.

Public Sub Header_Click_1(ByVal sender As Object, ByVal e As System.EventArgs)

SelezART = "Select * from ARTFILE order by ARTCODI"

artfresca()

lblHeader.Text = "per Codice"

 

'posiziona

'-------------

mValue = 0

VScroll1.Value = 0

art11.MoveFirst()

ripristinaGrid()

caricaGrid()

End Sub

 

Per gli altri headers si creano analogamente degli Eventi Click opportuni, cambiando la definizione di "SELEZART":

Public Sub Header_Click_2(ByVal sender As Object, ByVal e As System.EventArgs)

SelezART = "Select * from ARTFILE order by ARTNOME,ARTCODI"

 

 

Public Sub Header_Click_3(ByVal sender As Object, ByVal e As System.EventArgs)

SelezART = "Select * from ARTFILE order by STOCK,ARTNOME,ARTCODI"

 

Terminate queste operazioni possiamo lanciare il Progetto e visualizzare gli oggetti che abbiamo creato da codice:

  48.14 Movimento in .NET

Per far funzionare il MioGrid la prima cosa da fare e' caricare i Records, uno per ogni riga. Prepareremo quindi, in modo simile a quanto visto per il MioGrid ADO,  una "CARICAGRID" , parametrato naturalmente, con le sue ausiliarie "FUNGRID", "CAMPI" e "FUNCOLOR":

Sub caricaGrid()

art11.Position = Marka

scorta = 20

'MioRow

'-------------

funGrid(1)

funGrid(2)

funGrid(3)

funGrid(4)

funGrid(5)

funGrid(6)

End Sub

 

In "FUNGRID", dopo ogni "MOVENEXT"  bisogna lanciare la Sub "CAMPI"

Sub funGrid(Par)

'Formatta Celle

'---------------------------------

Cell1(Par).Left = MioLeft + MioHeight - 7

Cell1(Par).Width = colw1

Cell1(Par).TextAlign = 1

Cell2(Par).Left = Cell1(Par).Left + colw1

Cell2(Par).Width = colw2

Cell2(Par).TextAlign = 0

Cell3(Par).Left = Cell2(Par).Left + colw2

Cell3(Par).Left = Cell2(Par).Left + colw2

Cell3(Par).Width = colw3

Cell3(Par).TextAlign = 1

 

'colore

'----------------------

funColor(Par)

'GoSub campi

'-----------------------

If Par = 1 Then

campi(Par)

'---

Else 'Par

'---

art11.MoveNext()

campi(Par)

'---

End If 'Par

End Sub

 

In "CAMPI"  bisogna lanciare "ARTFIELDS()" per recuperare il nome dei Fields del Recordset. I dettagli di questo metodo sono stati trattati al Capitolo 7 a cui si rimanda. Bisogna poi tener conto che la tabella potrebbe avere pochi records (meno di MioRow). In questo caso, giunti alla fine del "Recordset" la posizione di "ART11" non aumenta, nonostante si sia lanciato il "MOVENEXT" in "FUNGRID". In questa situazione occorre che le celle siano sbiancate. Ecco la Routine:

Sub campi(Par)

 

If art11.Position + 1 > mPosition Then

mPosition = art11.Position + 1

artfields()

Cell1(Par).Text = art11_ARTCODI

Cell2(Par).Text = art11_ARTNOME

Cell3(Par).Text = virformdec(art11_STOCK)

If art11_STOCK < scorta Then

Cell3(Par).ForeColor = Color.Red

End If

 

Else

 

Cell1(Par).Text = ""

Cell2(Par).Text = ""

Cell3(Par).Text = ""

End If

 

End Sub

 

Ed ecco l'ausiliaria (opzionale) "FUNCOLOR":

Sub funColor(Par)

'colori alternati

'----------------------

Select Case Par

Case 2, 4, 6

Cell1(Par).ForeColor = Color.Black

Cell1(Par).BackColor = Color.Bisque

Cell2(Par).ForeColor = Color.Black

Cell2(Par).BackColor = Color.Bisque

Cell3(Par).ForeColor = Color.Black

Cell3(Par).BackColor = Color.Bisque

End Select

End Sub

 

L'altro elemento fondamentale del movimento e' la Routine di cambio valore dello VScroll1. Qui si definiscono la variabile "MARKA" che individua il primo record da cui partira' "CARICAGRID", nonche' la variabile "MPOSITION" da passare a "CAMPI" per decidere se le celle devono contenere valori o essere sbiancate. Ecco la routine:

Private Sub VScroll1_ValueChanged(sender As Object, e As System.EventArgs) Handles VScroll1.ValueChanged

ripristinaGrid()

 

'VScroll1.Maximum

'------------------------------

If VScroll1.Value > VScroll1.Maximum - 10 Then

art11.Position = MaxRowsArt - MioRow

Marka = art11.Position

mPosition = art11.Position

mValue = VScroll1.Value

caricaGrid()

Exit Sub

End If

 

'VScroll1.Minimum

'------------------------------

If VScroll1.Value = 0 Then

art11.MoveFirst()

Marka = art11.Position

mPosition = 0

mValue = 0

caricaGrid()

Exit Sub

End If

 

'muove

'-----------

If (VScroll1.Value = mValue + 1) And (art11.Position < MaxRowsArt) Then

Marka = Marka + 1

'-----------

ElseIf (VScroll1.Value = mValue - 1) And (art11.Position > 0) Then

Marka = Marka - 1

'-----------

Else

'-----------

pos = (VScroll1.Value * MaxRowsArt) / 100

If (pos > 0) And (pos < 1) Then

pos = 1

End If

art11.Position = pos

Marka = art11.Position

'-----------

End If

 

'memorizza

'-----------

mValue = VScroll1.Value

mPosition = Marka

caricaGrid()

 

End Sub

 

Ecco la Sub "RIPRISTINAGRID" che riporta i colori di tutte le righe alla situazione di partenza:

Sub ripristinaGrid()

Selezionato = 0

 

For i = 1 To MioRow

Cell1(i).BackColor = Color.White

Cell1(i).ForeColor = Color.Black

Next

 

For i = 1 To MioRow

Cell2(i).BackColor = Color.White

Cell2(i).ForeColor = Color.Black

 

Next

For i = 1 To MioRow

Cell3(i).BackColor = Color.White

Cell2(i).ForeColor = Color.Black

 

Next

End Sub

 

Ed ecco il MioGrid in azione:

 48.15 Lettura di un Record .NET

Ancora una volta si rimanda ai Primi Capitoli dell'Opera per rivedere i metodi da adottare.

Qui la Routine "CMDREAD" lancia l'"ARTSK2" e la Routine "ARTTEXT" riempie le sue TextBox con i valori dei campi del Record prescelto:

Private Sub cmdRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRead.Click

'mioGrid

'---------------

If Selezionato = 0 Then

MsgBox("Selezionare un Record ! ")

Exit Sub

End If

 

Dim foundIndex As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex

 

On Error GoTo errori

 

'rinfresc

'----------------

artfields()

Artsk2.txtArtcodi.Text = art11_ARTCODI

artfresca()

Dim foundIndex2 As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex2

arttext()

 

'mostra maschera

'----------------

Artsk2.cmdRitvid.Visible = True

Artsk2.Show()

 

Me.Enabled = False

'routine errori

'------------------

Exit Sub

errori:

MsgBox("sorry. il Record nel frattempo è stato" & acapo & " cancellato da un altro utente !")

art11.MoveFirst()

 

End Sub

 

Ricordiamo qundi, per memoria, questa Routine:

Sub arttext()

artfields()

Artsk2.txtArtcodi.Text = art11_ARTCODI

Artsk2.txtArtnome.Text = art11_ARTNOME

Artsk2.txtDatagg.Text = art11_DATAGG

Artsk2.txtTipo.Text = art11_TIPO

Artsk2.txtUm.Text = art11_UM

Artsk2.txtStock.Text = virformdec(art11_STOCK)

Artsk2.txtCosbanetto.Text = virformat(art11_COSBANETTO)

Artsk2.txtProcogn.Text = art11_PROCOGN

Artsk2.txtPronome.Text = art11_PRONOME

End Sub

 

Ed ecco un esempio di scheda Articolo:

Nel bottone "CMDRITVID" di "ARTSK2 (che fa ritornare ad  "ARTSK1") occorre rilanciare "CARICAGRID" nel caso che si vogliano ricostruire i colori delle righe alternate:

Private Sub cmdRitvid_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRitvid.Click

Artsk1.Enabled = True

Artsk1.caricaGrid()

Me.Close()

End Sub

 

 

48.16 Modifica di un Record .NET

Anche per il bottone "CMDEDIT" in "ARTSK1" bisogna aggiungere lo stesso blocchetto, visto per la lettura qui sopra, per il controllo della avvenuta selezione. Ecco la Routine. Inoltre si imposta la data del giorno in cui si fa la modifica:

Private Sub cmdEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEdit.Click

'MioGrid

'---------------

If Selezionato = 0 Then

MsgBox("Selezionare un Record ! ")

Exit Sub

End If

 

Dim foundIndex As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex

On Error GoTo errori

 

'rinfresca

'----------------

artfields()

Artsk2.txtArtcodi.Text = art11_ARTCODI

artfresca()

Dim foundIndex2 As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex2

arttext()

Artsk2.txtDatagg.Text = Date.Today

 

'controlla rete

'----------------

If art11_fliprete = 1 Then

MsgBox("il Record è in uso. attendere e ritentare")

Exit Sub

End If

 

'blocca rete

'----------------

artfields()

SQL1 = "UPDATE ARTFILE set FLIPRETE=1"

SQL1 = SQL1 & " where ARTCODI = " & art11_ARTCODI & " "

Updata()

Dim foundIndex3 As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex3

 

'mostra maschera

'----------------

'Artsk2.txtArtcodi.Enabled = False

'----------------

artfields()

wartcodi = art11_ARTCODI

'--------------------

Artsk2.cmdConfEdit.Visible = True

Artsk2.cmdAbandon.Visible = True

Artsk2.Show()

Me.Enabled = False

 

'routine errori

'------------------

Exit Sub

errori:

MsgBox("sorry. il Record nel frattempo è stato" & acapo & " cancellato da un altro utente !")

art11.MoveFirst()

End Sub

 

Inoltre in "ARTSK2" occorre lanciare in "CMDCONFEDIT" le istruzioni necessarie per rinfrescare il MioGrid. Ecco il frammento:

Private Sub cmdConfEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConfEdit.Click

'campi non validi

'----------------------

flaart = True

artcheck()

If flaart = False Then

Exit Sub

End If

 

'Codice cambiato

'-------------------------

Dim zartcodi = Val(txtArtcodi.Text)

If zartcodi <> wartcodi Then

'---

Dim FoundIndex = art11.Find("ARTCODI", zartcodi)

If FoundIndex > -1 Then

MsgBox(zartcodi & " già esiste!")

Exit Sub

Else

art11.Find("ARTCODI", wartcodi)

End If

'---

End If 'zartcodi

 

'modifica e sblocca Record

'-------------------------

ARTupda()

Updata()

 

'ritorna a video lista

'---------------------------

Artsk1.Enabled = True

Artsk1.caricaGrid()

Me.Close()

End Sub

 

48.17 Cancellazione di un Record .NET

Anche qui occorre introdurre in "ARTSK1" il controllo di "SELEZIONATO". Inoltre dopo aver lanciato l'"ARTSK2" occorrre sbiancare il MioGrid per prepararlo alla riscrittura dopo la avvenuta cancellazione. Ecco la Routine

Private Sub cmdDele_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDele.Click

'mioGrid

'---------------

If Selezionato = 0 Then

MsgBox("Selezionare un Record ! ")

Exit Sub

End If

Dim foundIndex As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex

 

On Error GoTo errori

'rinfresca

'----------------

artfields()

Artsk2.txtArtcodi.Text = art11_ARTCODI

artfresca()

Dim foundIndex2 As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex2

arttext()

 

'controlla rete

'----------------

If art11_FLIPRETE = 1 Then

MsgBox("il Record è in uso. attendere e ritentare")

Exit Sub

End If

 

'blocca rete

'----------------

artfields()

SQL1 = "UPDATE ARTFILE set FLIPRETE=1"

SQL1 = SQL1 & " where ARTCODI = " & art11_ARTCODI & " "

Updata()

Dim foundIndex3 As Integer = art11.Find("ARTCODI", Cell1(Ind).Text)

art11.Position = foundIndex3

 

'mostra maschera

'----------------

Artsk2.txtArtcodi.Enabled = False

Artsk2.cmdConfDele.Visible = True

Artsk2.cmdAbandon.Visible = True

Artsk2.Show()

Me.Enabled = False

 

For i = 1 To MioRow

Cell1(i).Text = ""

Cell2(i).Text = ""

Cell3(i).Text = ""

Next

 

'routine errori

'------------------

Exit Sub

errori:

MsgBox("sorry. il Record nel frattempo è stato" & acapo & " cancellato da un altro utente !")

art11.MoveFirst()

End Sub

 

Ed in "ARTSK2" si aggiungono le istruzioni per il MioGrid:

Private Sub cmdConfDele_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConfDele.Click

On Error GoTo errori

'cancella

'---------------------------

SQL1 = "DELETE from ARTFILE where ARTCODI = " & art11_ARTCODI & " "

Updata()

art11.MovePrevious()

 

'rinfresca

'---------------------------

artfields()

txtArtcodi.Text = art11_ARTCODI

artfresca()

 

'ritorna a video lista

'---------------------------

Artsk1.Enabled = True

Cn.Close()

apriprogetto()

SelezART = "Select * from ARTFILE order by ARTCODI"

artfresca()

Artsk1.lblHeader.Text = "per Codice"

Artsk1.ripristinaGrid()

Artsk1.caricaGrid()

Artsk1.VScroll1.Value = 100

Artsk1.VScroll1.Value = 0

Me.Close()

 

'errore di Tabella vuota

'---------------------------------

Exit Sub

errori:

'---

artvuoto = True

Dt_ARTFILE.Clear()

Da_ARTFILE.Fill(Dt_ARTFILE)

art11.DataSource = Dt_ARTFILE

'---

Artsk1.butfalse()

Artsk1.cmdExit.Enabled = True

Artsk1.cmdNew.Enabled = True

Artsk1.Enabled = True

Me.Close()

End Sub

 

Bisogna poi prevedere il caso che si rinunci alla cancellazione, cioe' si prema il bottone "CMDABANDON" in "ARTSK2". Anche in questo caso bisogna rinfrescare il MioGrid:

Private Sub cmdAbandon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAbandon.Click

If cmdConfEdit.Visible = True Or cmdConfDele.Visible = True Then

artfields()

SQL1 = "UPDATE ARTFILE set FLIPRETE=0"

SQL1 = SQL1 & " where ARTCODI = " & art11_ARTCODI & " "

Updata()

End If

 

'torna a video lista

'---------------------------

Artsk1.Enabled = True

Artsk1.caricaGrid()

Me.Close()

End Sub

 

48.18 Aggiunta di un nuovo Record .NET

La Routine "CMDNEW" non riceve modifiche rispetto quella che conosciamo gia' dai Capitoli 1 a 10. La ripetiamo per memoria. Si noti la precauzione di impostare il campo "DATAGG" con la data del giorno in cui si fa l'operazione. In ogni caso il campo data non va lasciato blank:

Private Sub cmdNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNew.Click

Dim zARTCODI

If artvuoto = False Then

Dim zSelezART = SelezART

SelezART = "Select * from ARTFILE order by ARTCODI"

artfresca()

art11.MoveLast()

artfields()

zARTCODI = art11_ARTCODI

zARTCODI = zARTCODI + 1

SelezART = zSelezART

artfresca()

Else

zARTCODI = 1

End If 'artvuoto

 

'lancia artsk2

'-----------------------

artblank()

Artsk2.txtArtcodi.Text = zARTCODI

Artsk2.txtDatagg.Text = Date.Today

'--------------------

Artsk2.cmdConfnew.Visible = True

Artsk2.cmdAbandon.Visible = True

Me.Enabled = False

Artsk2.Show()

End Sub

 

Invece in "ARTSK2" occorre aggiungere le istruzioni specifiche di MioGrid:

Private Sub cmdConfnew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConfnew.Click

'campi non validi

'-----------------------

flaart = True

artcheck()

If flaart = False Then

Exit Sub

End If

 

'controlla artcodi duplicato

'----------------------

Dim foundIndex As Integer = art11.Find("ARTCODI", txtArtcodi.Text)

If foundIndex > -1 Then

MessageBox.Show(" " + Trim(txtArtcodi.Text) & acapo & " gia' esiste !")

Exit Sub

End If

 

'aggiunge il Record

'----------------------------------

'crea una Row

'--------------

dsNewRow = Ds_MAGFILE.Tables("MAGFILE").NewRow()

'riempie la Row

'----------------

artnew()

 

'aggiunge il Record

'----------------

Ds_MAGFILE.Tables("MAGFILE").Rows.Add(dsNewRow)

Da_ARTFILE.Update(Ds_MAGFILE, "MAGFILE")

 

'rinfresca

'----------------------------------

artfresca()

 

'torna a video list

'----------------------------------

artvuoto = False

Artsk1.Enabled = True

Artsk1.buttrue()

 

Artsk1.caricaGrid()

Artsk1.VScroll1.Value = 100

Me.Close()

End Sub

 

 

 

Fine del Capitolo 48. MioGrid