Newsgroup: it.comp.lang.visual-basic
Titolo: Grid con selezione multipla non contigua

Salve a tutti.
Ho sempre utilizzato il controllo MSFlexGrid senza problemi, ma adesso mi
trovo nella necessità di poter selezionare delle righe non contigue nella
grid, per esempio la prima la terza la quarta e l'ottava contemporaneamente.
Esiste un modo per farlo con la MSFlexGrid? Oppure in alternativa, esiste un
controllo che me lo permetta?
Grazie a tutti per la considerazione, leggerò attentamente ogni risposta o
commento.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 risposta o commento.
Io tempo fa lo feci sulla hyerarchical flexgrid, che è molto simile alla 
flexgrid ma più potente.
Purtroppo il sistema era quello di eliminare la selezione "standard" e di 
ridisegnare le celle selezionate tramite l'API GDI.
Và che fortuna... mi ero fatto una funzioncina apposta :P
Tx e Ty sono gli Screen.TwipsPerPixel che dipende dal fatto che usavo i 
Twips come scalemode del form.
Questa funzione per fare in fretta faceva semplicemente con la BitBlt il 
"negativo" delle celle da selezionare e deselezionare (ecco il perchè del 
commento: prima si pulisce la griglia e poi si ridisegnano le celle 
selezionate).
Il negativo significa che le celle bianche scritte in nero diventavano nere 
scritte in bianco, se non ti piace dovrai usare anzichè la BitBlt qualcosa 
tipo la FloodFill e DrawText.
Ciao
Public Sub SelCell(Gr As MSHFlexGrid, ByVal Col As Integer, ByVal Row As 
Integer)
    Dim dc As Long
    Dim c As RECT
    'occorre richiamare un gr.refresh prima di questa procedura
    'per ridipingere tutta la griglia, altrimenti le celle selezionate
    'si deselezionano
    If Gr.RowIsVisible(Row) = False Then Exit Sub
    dc = GetDC(Gr.hWnd)
    c.Top = Gr.RowPos(Row) \ ty
    c.Left = Gr.ColPos(Col) \ Tx
    c.Right = Gr.ColWidth(Col) \ Tx
    c.Bottom = Gr.RowHeight(Row) \ ty
    Call BitBlt(dc, c.Left, c.Top, c.Right, c.Bottom, dc, c.Left, c.Top, 
NOTSRCCOPY)
    Call ReleaseDC(Gr.hWnd, dc)
End Sub 

 flexgrid ma più potente.
[...CUT...]
Ciao Fabio, grazie per la risposta. Purtroppo non sono riuscito a farla
funzionare, ma probabilmente sbaglio qualcosa nella chiamata. Ho eseguito lo
stesso tentativo anchce con un controllo FlexGrid semplice, ma il risultato
è lo stesso. Il codice con il quale ho provato, oltre ovviamente alle
dichiarazioni delle API, è il seguente:
Private Sub hfx1_MouseDown(Button As Integer, Shift As Integer, x As Single,
y As Single)
    hfx1.Refresh
    If Shift And vbCtrlMask Then
        SelCell hfx1, hfx1.Col, hfx1.Row
    End If
End Sub
Public Sub SelCell(Gr As MSHFlexGrid, ByVal Col As Integer, ByVal Row As
Integer)
    Dim dc As Long
    Dim c As RECT
    Dim tx As Single, ty As Single
    tx = Screen.TwipsPerPixelX
    ty = Screen.TwipsPerPixelY
    'occorre richiamare un gr.refresh prima di questa procedura
    'per ridipingere tutta la griglia, altrimenti le celle selezionate
    'si deselezionano
    If Gr.RowIsVisible(Row) = False Then Exit Sub
    dc = GetDC(Gr.hwnd)
    c.Top = Gr.RowPos(Row) \ ty
    c.Left = Gr.ColPos(Col) \ tx
    c.Right = Gr.ColWidth(Col) \ tx
    c.Bottom = Gr.RowHeight(Row) \ ty
    Call BitBlt(dc, c.Left, c.Top, c.Right, c.Bottom, dc, c.Left, c.Top,
NOTSRCCOPY)
    Call ReleaseDC(Gr.hwnd, dc)
End Sub
In ogni caso non sono nemmeno sicuro che sia esattamente quello che sto
cercando, quindi permettimi di spiegarti meglio.
L'utente estrae dal database una serie di documenti, e io glieli mostro
nella grid. Per ogni documento gli mostro la data, il numero, la serie, il
totale, ecc. mentre memorizzo l'ID documento nella proprietà RowData.
Ora l'utente deve avere la possibilità di selezionarne qualcuno per fare
delle operazioni, ad esempio stampare il primo, il quinto e il dodicesimo
della grid. Io devo poterli selezionare graficamente nella grid, per
mostrare all'utente quelli che ha scelto, ma devo anche poter recuperare il
valore di RowData per ogni riga selezionata.
Se l'utente selezionasse delle righe contigue, diciamo dalla 3 alla 8,
potrei leggere questa proprietà con un semplice ciclo. Infatti basterebbe
operare con il valore delle due proprietà RowSel e Row, perché in quel caso
RowSel indica l'inizio della selezione.
Per selezionare le righe contigue dalla 3 alla 8 posso trascinare il mouse
sulle intestazioni di riga, oppure clicco la 3 e la 8 tenendo premuto Shift,
come di consueto in ambiente Windows. Bene, io vorrei poter ottenere
l'effetto che si ottiene quando si seleziona con il tasto Ctrl premuto:
clicco sulla riga 3, poi sulla riga 8, e sono selezionate solo la riga 3 e
la 8, e io sono in grado di sapere che le righe selezionate sono queste due
in modo da poterne leggere i valori di RowData.
E' possibile fare una cosa del genere? E altrimenti quale controllo serve?
Grazie ancora per l'interessamento.


 E' possibile fare una cosa del genere? E altrimenti quale controllo serve?
Io non ne conosco.
Credo che ci sia qualche griglia in 
www.vbaccelerator.com
 ma non so se fa 
quello che vuoi.
Ciao

 Grazie ancora per l'interessamento.
Ciao yronium,
anche io avevo il tuo stesso problema, e con la MSHFlexGrid non sono
riuscito a
risolvere il problema. Ho risolto il problema con la Janus Grid, un
ottimo prodotto,
molto flessibile e funzionale.
Ecco l'indirizzo 
www.janusys.com
Ciao.

 Ecco l'indirizzo 
www.janusys.com
Ehi, grazie della dritta. Vado subito a vedere.


 Ehi, grazie della dritta. Vado subito a vedere.
Si, l'ho vista e potrebbe fare al caso mio, ma è troppo cara e non posso
pemettermela per il progetto corrente.
Grazie lo stesso della segnalazione. Rimango comunque in attesa di eventuali
altre idee.


 pemettermela per il progetto corrente.
E' vero, è un po costosa. ma se guardi bene nel sito c'è la versione
ridistributable... se impari a programmarla non ti serve
acquistarla...
Ciao.