Gridview e checkbox

lunedì 18 agosto 2008 - 15.32

paglio_go Profilo | Newbie

sto provando a popolare una gridview con 2 colonne boundfield ed una checkboxfield, ma quest'ultima mi si visualizza in sola lettura (onlyread è impostata a false) non permettendone la modifica per un aggiornamento sul db.
è sbagliato utilizzare la gridview per questo scopo, oppure esiste un modo per renderlo editabile?
grazie

sankyu Profilo | Senior Member

trasforma la checkbox field in un template ed edita i databinding andrà al primo colpo!
hai inserito nel datasource l'update command vero?? se no non va!

paglio_go Profilo | Newbie

grazie, il problema è che già al momento della select iniziale delle righe devono essere checkate, è possibile farlo?

Anonimo Profilo | Senior Member

Si con la sintassi

<%= Convert.toboolean(Eval("nomecampo")) %>


Team Icon - Software Engineering
------------------------------
Unicredit Global Information Services Spa
Chief Solution Architect

paoval72 Profilo | Senior Member

Ciao, se vuoi solo rendere editabili le checks, puoi agire sul rowbound (dopo l'associazione del dato alla riga):

protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
GridViewRow gwr = (GridViewRow)e.Row;
if (gwr.RowType == DataControlRowType.DataRow) //evito di controllare header e footer
{
DataControlFieldCell fc = (DataControlFieldCell)gwr.Cells[2]; //qui ho ipotizzato la check alla posizione 3
CheckBox cb = (CheckBox)fc.Controls[0]; //ne prendo il controllo
cb.Enabled = true; // la abilito
}
}

PV


Anonimo Profilo | Senior Member

Sei un grande Paolo!!!
Buon lavoro dall'ermellino!!!


Team Icon - Software Engineering
------------------------------
Unicredit Global Information Services Spa
Chief Solution Architect

paglio_go Profilo | Newbie

grazie, provate ed entrambe funzionanti!

paglio_go Profilo | Newbie

Ho un altro problema.. dopo che l'utente seleziona una o più checkbox deve aver la possibilità di ordinare, tramite un bottone esterno alla gridview, visualizzando prima tutti i record selezionati e poi gli altri.
Ho provato con il gridview.Sort ma mantiene i dati originali, ho provato a recuperare i dati come sotto, ma non riesco a creare un nuovo gridview con questi dati, od aggiornare quello vecchio

for (int i = 0; i < GV_tipi.Rows.Count; i++)
{
GridViewRow gwr = (GridViewRow)GV_tipi.Rows[i];
DataControlFieldCell fc = (DataControlFieldCell)gwr.Cells[0];
CheckBox cb = (CheckBox)fc.Controls[0];
if (cb.Checked)
{
ar_tipi.Add(GV_tipi.Rows[i].Cells[1].Text);
}
}

paoval72 Profilo | Senior Member

Ciao, stavo provando alcune soluzioni. Hai molti dati su cui lavorare?

PV

paglio_go Profilo | Newbie

sono un migliaio di record

paoval72 Profilo | Senior Member

Lo scoglio principale mi sembra il recupero dei dati. Mi spiego: carico la prima volta, seleziono o deseleziono le checks che mi interessano. Fin qui ok. Il problema è qui: se non salvo su DB, ho difficoltà nel recuperare i miei dati modificati.
Se hai un migliaio di record, credo userai il paging per non fare una lista lunga un km. Ma non posso scansionare il gridview per vederne le modifiche(lavora solo sulla pagina visualizzata in quel momento). E non posso neanche lavorare sui dati originali, visto che non hanno subìto le mie modifiche.
L'ideale sarebbe salvare sul DB (magari lo fai già e non l'avevo capito) e poi fare il sorting dalla nuova base dati.

spero di non essere stato troppo oscuro.
PV

paglio_go Profilo | Newbie

intanto grazie mille..
volevo evitare di salvare su db perchè questo riordinamento serve visivamente all'utente prima di dare l'ok definitivo alle modifiche apportate (solo in questo momento posso salvare)
speravo si riuscisse a caricare un array (o datatable) e ripopolare da questo il gridview, ma non so se e come si possa fare.. oppure gestire la cosa lato client, ma anche qua i tentativi fatti non sono andati a buon fine

paoval72 Profilo | Senior Member

hai un identificatore univoco per ogni riga? Un ID, una chiave che rende unico ogni record?


PV

paglio_go Profilo | Newbie

si ho id

paoval72 Profilo | Senior Member

Come ti dicevo, il problema grosso è il paging. Se i dati fossero tutti in una pagina o fossero pochi, non ci sarebbero troppi problemi perchè il dataSource coinciderebbe con quello che hai a video. Purtroppo, avendo il paging, puoi scansionare le righe solo della pagina visualizzata. Esempio: se ho 3000 records sul dataTable originale e ho un paging di 10 record per pagina sul gridview, se faccio un ciclo sulle righe del gridview ne troverò sempre solo 10, cioè quelle visualizzate. Magari ci sono altre tecnichem, ma quelle che mi vengono in mente sono piuttosto grezze, sebbene complesse. Oppure potresti provare con Ajax.
Come sempre, se riesco a combinare qualcosa ti faccio sapere.
Ciao,
PV


paglio_go Profilo | Newbie

in realtà almeno per il momento il paging non mi è stato richiesto.. immagino lo faranno, però intanto mi diresti come si potrebbe procedere?

paoval72 Profilo | Senior Member

Ok, ti dico come farei.
Partiamo dalll'html. Bisogna attivare il sorting (allowsorting=true) del gridview e bisogna creare l'evento per il sorting: OnSorting="mioGridView_Sorting" (il metodo lo puoi chiamare come vuoi, basta che come parametri abbia quelli richiesti dal sorting, che vedremo lato server).
Alla CheckBoxField passiamo come SortExpression il nome del suo DataField + la direction DESC (descending, discendente)
Esempio. <asp:CheckBoxField DataField="Check" SortExpression="Check DESC" /> //Questo DataField è ovviamente il mio, creato per prova

Passiamo al lato server. Non so che DataSource usi per riempire la gridview, ma facciamo finta che sia un DataTable. Prima o dopo il binding del gridview ho ipotizzato 2 opzioni, sempre controllando che sia il primo accesso ( if(!isPostBack) ):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
A runtime, per ogni riga attivo anche l'AutoPostback. E' fastidioso perchè selezionando un elemento ricarica ogni volta la pagina, ma così evito un javascript per avere sempre aggiornato il mio gridview:

protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) { GridViewRow gwr = (GridViewRow)e.Row; if (gwr.RowType == DataControlRowType.DataRow) { DataControlFieldCell fc = (DataControlFieldCell)gwr.Cells[2]; CheckBox cb = (CheckBox)fc.Controls[0]; cb.Enabled = true; cb.AutoPostBack = true; } }

Nell'evento Click del bottone lancio il sort:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Adesso registro l'evento sorting, che viene richiamato dal mio button. dentro recupero il mio datasource (da viewstate o da variabile statica)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Questo è quello che ho progettato. Vedi se ti può servire, per ora.
Ciao,
Paolo

paglio_go Profilo | Newbie

grazie mille, non posso usare l'autopostback ad ogni modo mi è stato veramente utile
ciao lorenzo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5