21 messaggi dal 03 marzo 2009
Ciao a tutti,
ho una gridview denominata GridViewDepositi che creo così:
GridViewDepositi.DataSource = GetTable()
GridViewDepositi.DataBind()
dove GetTable è una funzione che crea una datatable e la popola con una serie di valori.

Il tutto funziona perfettamente fino a quando non mi pongo il problema di modificare esteticamente il risultato del mio lavoro.
Nel particolare non riesco a modificare la larghezza delle colonne con GridViewDepositi.Columns(1).ItemStyle.Width = colWidth
Il problema è che il columns.count è sempre zero quindi non risultano colonne da modificare...

Come posso risolvere?

Uso questo sistema per visualizzare una gridview a colonne variabili. dove il contenuto delle colonne è calcolato attraverso numerose queries SQl relativamente complesse.... esiste un sistema migliore???


A presto

Paolo
29 messaggi dal 24 marzo 2008
Ciao Paolo,
prova ad intercettare l'evento RowCreated del Gridview in questo modo:

protected void GridViewDepositi_RowCreated(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Width = Unit.Pixel(300);
}

in questo caso tutte le prime celle di ogni riga (intestazioni comprese) verrebbero formattate a 300px di larghezza.

spero ti sia utile :)

Nulla è reale...tutto è lecito...
5.610 messaggi dal 09 febbraio 2002
Contributi
EDIT: quello che ha detto dadox77 ^^

Ciao, si può fare ma mi sfugge una cosa: se le colonne sono dinamiche, come fai a sapere a priori che la colonna con indice 1 dovrà avere una certa larghezza?

Puoi sottoscrivere l'evento RowCreated della GridView e impostare la larghezza da lì:

<asp:GridView AutoGenerateColumns="true" OnRowCreated="rowCreated" ... />

Nel codefile metti
protected void rowCreated(object sender, GridViewRowEventArgs e)
{
    //do una larghezza alla prima e seconda cella
    e.Row.Cells[0].Width = 200;
    e.Row.Cells[1].Width = 80;

    //Gli do anche un nome di classe.
    //Avrò colonna-nome, colonna-cognome, colonna-eta, ecc...
    //Così neanche mi importa in che ordine si trovano e nell css
    //potrò dargli uno stile secondo il loro nome
    for (int i = 0; i < e.Row.Cells.Count; i++)
        e.Row.Cells[i].CssClass = "colonna-" + e.Row.Cells[i].Text.ToLower();

    //cancello la sottoscrizione dell'evento rowCreated perché è sufficiente
    //impostare la larghezza delle celle nella prima riga. Le celle nelle
    //successive righe assumeranno le stesse larghezze
    tuaGridView.RowCreated -= rowCreated;
}

Modificato da BrightSoul il 21 novembre 2011 23.11 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
21 messaggi dal 03 marzo 2009
La prima colonna della gridview è l'unica conosciuta :-)
Le altre colonne sono variabili, ma tutte di stessa dimensione in quanto vi vengono rappresentati dei semplici contatori

Sull'evento rowcreated il ridimensionamento funziona perfettamente,
grazie!!!

A presto

Paolo
21 messaggi dal 03 marzo 2009
Salve di nuovo :-)

non riesco però ad adattare questo:

tuaGridView.RowCreated -= rowCreated;

al mio codice in VB

Grazie
29 messaggi dal 24 marzo 2008
Ciao Paolo,
in VB devi utilizzare il metodo RemoveHandler passando il nome della funzione.

Prova in questo modo:

RemoveHandler GridViewDepositi.RowCreated, AddressOf GridViewDepositi_RowCreated

A presto :)

Nulla è reale...tutto è lecito...
21 messaggi dal 03 marzo 2009
Pista abbandonata...
proprio non riesco ad comprendere il meccanismo...

Io sto facendo un pannello di controllo di un semplice sistema di troubleticket, ogni record della grid view è rappresentato da un mio utente, ogni colonna è rappresentata da un diverso settore per cui l'utente può aver aperto dei ticket. Il numero dei settori può essere alto e vengono visualizzati solo quelli per cui risultano ticket aperti.
Si gli utenti che i numeri che appaiono nelle colonne settori sono link a report di dettaglio.

Ho costruito una datatable che rappresenta esattamente quanto vorrei vedere a video, ma se mi limito ad usare il bind di una gridview "vuota" con la mia datatable ho enorme difficoltà a lavorare successivamente sulla gridview per impostazioni "tipografiche" quali allineamenti etc etc oppure per inserire hyperlink o altro.

Ora sto provando a lavorare con una gridview collegata ad un datasource che produce la sola colonna relativa agli utenti con ticket aperti e poi ad aggiungere le restanti colonne.
Anche qui ho un po' di difficoltà perché ignoro il sistema di funzionamento generali

Immagino di aggiungere le colonne (boundfield) e poi lavorare in rowdatabound con e.row.cell(n).text ...

é il sistema giusto?

Grazie

Paolo
29 messaggi dal 24 marzo 2008
Ciao Paolo, scusa se ti rispondo con ritardo.
Purtroppo l'unico metodo che conosco per modificare a runtime i dati presenti in un gridview è proprio come hai detto tu, e cioè intercettare l'evento RowDataBound e lavorare sulla proprietà text delle celle.

Prendendo spunto da quello che hai scritto supponiamo di lavorare sulla prima colonna del gridview (come abbiamo fatto prima) e che i valori siano una serie di codici settore (1 - 2 - 3 ecc.)

Questo codice trasforma i valori contenuti nella cella (che normalmente arrivano come testo) in hyperlink che puntano ad un'ipotetica pagina "dettagli.aspx" a cui viene passata come querystring il codice settore:


    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex >= 0)
            e.Row.Cells[0].Text = string.Format("<a href=\"dettagli.aspx?id={0}\">{0}</a>", e.Row.Cells[0].Text);
    }



Il valore che vedi a video è sempre il codice settore poichè è anche impostato come etichetta per il collegamento.

Riprendendo l'ottimo spunto di BrightSoul potresti rendere tutte le colonne "cliccabili" inserendo il tutto in un ciclo for


        if (e.Row.RowIndex >= 0)
        {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
                e.Row.Cells[i].Text = string.Format("<a href=\"dettagli.aspx?id={0}\">{0}</a>", e.Row.Cells[i].Text);
            }
        }



Ovviamente dovresti fare in modo che in base alla colonna il link punti alla pagina che ti interessa.

Fammi sapere se può esserti utile

A presto ;)

Nulla è reale...tutto è lecito...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC