n° 154
Settembre 2010
Settembre 09, 2010, 10:25:00 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: Usi il PC già da qualche anno? partecipa alla discussione nell'area Retrocomputing
 
   Indice   Linux Windows Internet videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


 SONDAGGIO
Saresti interessato a seguire online dei videocorsi?
Sì | No
Se sì, quali di questi argomenti sarebbero di tuo gradimento?

.NET Framework   PHP
ASP.NET Python
Attività SEO Ruby
C# Silverlight
C/C++ Visual Basic .NET
Java Windows Azure
Java per Android Windows Phone 7
Objective-C (iPhone / iPad) Altri

Attenzione! Per partecipare al sondaggio bisogna essere registrati al forum




* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Immagini nel gridview a colonne  (Letto 960 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
benetz
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 193



Mostra profilo WWW
« inserita:: Febbraio 12, 2010, 05:14:35 pm »

Ciao a tutti, ho il seguente problema:

Devo visualizzare una specie di album in un GridView..
Per ora visualizzo una riga per ogni immagine che ho nel database, però vorrei visualizzare le immagini a colonne.. cioè visualizzare ad esempio tre colonne affiancate.

Come posso fare? qualcuno ha già avuto modo di provare una cosa del genere?

Grazie mille in anticipo.
Registrato

Chi fa domande rischia di sembrare stupido, chi non le fa rischia di restare stupido.
alex.75
Jr. Member
**

Karma: +10/-1
Scollegato Scollegato

Messaggi: 222



Mostra profilo WWW
« Risposta #1 inserita:: Febbraio 12, 2010, 08:31:19 pm »

Per la situazione descritta è più adatto un DataList.
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalist.aspx

Ciao
Registrato
benetz
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 193



Mostra profilo WWW
« Risposta #2 inserita:: Febbraio 15, 2010, 01:03:40 pm »

Ho risolto con un listView.. grazie mille cmq!!
Registrato

Chi fa domande rischia di sembrare stupido, chi non le fa rischia di restare stupido.
GiovanniD
Jr. Member
**

Karma: +5/-0
Scollegato Scollegato

Messaggi: 146



Mostra profilo WWW
« Risposta #3 inserita:: Febbraio 15, 2010, 01:25:26 pm »

la soluzione poteva anche essere quella di agire sul row databound ed avere tutti campi testo, poi ti andavi a scrivere qualcosa del tipo
Codice:
e.Row.Cells[numero della colonna].Text = "<a href='"+indirizzoimmagine+"' target='_blank' alt='descrizione'>thumbnail dell'immagine</a>";
io per inserire immagini nella gridview (che normalmente dipendono da valori presi da qualche parte) faccio così e devo dire mi trovo abbastanza bene Sorriso

Grazie ad alex per avermi fatto notare lo strafalcione Sorriso
Registrato

benetz
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 193



Mostra profilo WWW
« Risposta #4 inserita:: Febbraio 15, 2010, 05:40:51 pm »

Una possibilità era anche di caricarmi il GridView da codice: Al Grid assegnavo tre colonne di tipo image, e da codice mi caricavo le immagini, le dividevo per le tre colonne e lo andavo a caricare..

Ma con il listView è molto più facile.. l'ho collegato direttamente al DataSource e si arrangia lui a caricarsi e a dividerle in colonne.. Sorriso

Al massimo da codice cambio il SelectCommand del DataSource..
Registrato

Chi fa domande rischia di sembrare stupido, chi non le fa rischia di restare stupido.
alex.75
Jr. Member
**

Karma: +10/-1
Scollegato Scollegato

Messaggi: 222



Mostra profilo WWW
« Risposta #5 inserita:: Febbraio 15, 2010, 07:27:58 pm »

Hai usato un ListView e fai benissimo.

Gridview - Limited in design, works like an html table. More in built functionality like edit/update, page, sort. Lots of overhead.

ListView - the new Datalist Sorriso. Almost a hybrid of the datalist and gridview where you can use paging and build in Gridview like functionality, but have the freedom of design. One of the new controls in this family.

Repeater - Very light weight. No built in functionality like Headers, Footers. Has the least overhead.

Se non c'è paginazione ne editing dei dati è totalmente fuoriluogo usare un GridView per mostrare delle miniature di immagini.
Per il semplice motivo che è sovradimensionato ed offre (meglio dire "si porta dietro") una sessantina di proprietà/eventi assolutamente non necessari alla situazione (neanche in previsione di una espandibilità futura).
Se non avessi avuto bisogno dell'incolonnamento sarebbe stato corretto usare un Repeater
(e lo si potrebbe anche usare lo stesso).
Al Repeater/DataList/ListView puoi sempre benissimo aggiungere le funzionalità che ti servono a mano (selezione, editing ...).

Una reale alternativa (se necessario estremizzare l'ottimizzazione) potrebbe essere non utilizzare nessuno dei suddetti WebControl ma bensi TableControl od addirittura un HtmlControl.
In questo modo dovresti però cimentarti con un pò di matematica per creare la scacchiera di <tr> e <td>, solo un po di lavoro "manuale" e test in più...

Indipendentemente dal fatto che il Response.Write è inutilizzabile usando una GridView od altro WebControl (Giovanni, mi sono perso qualcosa?), io se non c'è reale necessità di "effettuare operazioni" in base all'item corrente, eviterei di scomodare il DataBound dello stesso.
Così facendo la gestione del codice riguardante la griglia rimane in un posto solo.
Tuttalpiù richiamo delle funzioni apposite per la renderizzazione/formattazione, ad esempio:
       
Codice:
<asp:DataList runat="server" ID="listProducts" RepeatLayout="Table" HorizontalAlign="Center" RepeatDirection="Horizontal" RepeatColumns="5">
            <ItemTemplate>
                <a href="Product.aspx?id=<%# ((Product)Container.DataItem).Id  %>">
                <div class="productPanel">
                    <div class="productName"><%# ((Product)Container.DataItem).Name %></div>
                    <img  class="photo" src="<%# RenderImageUrl((Product)Container.DataItem) %>" />
                    <div class="productPrice"><%# RenderPrice(((Product)Container.DataItem).Price)%></div>
                </div>
                </a>
            </ItemTemplate>
        </asp:DataList>
Altro consiglio/idea.
La proprietà RepeatColumns=5 è un default, in realtà viene settata nel primo PageLoad della pagina in base alla larghezza disponibile sul browser dell'utente. Tale valore di larghezza è memorizzato preventivamente in un cookie tramite javascript.
La stessa tecnica la uso per "decidere" quante righe deve avere una GridView paginata (sempre comunque un multiplo di 5).
Ancora non ho mai usato il ListView ma spero sia possibile variare il numero di colonne a runtime...

ciao
Registrato
benetz
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 193



Mostra profilo WWW
« Risposta #6 inserita:: Febbraio 16, 2010, 10:07:19 am »

Xò.. grazie per avermi informato di tutte queste possibilità... da dire che da poco mi sono buttato nella programmazione con asp net, e che sono ancora alle prime armi, questo mi ritornerà di sicuro utile in futuro!! grazie mille!!


Ps: con il listView è possibile determinare quante colonne visualizzare.. e mi è sembrato molto facile da usare per quello che dovevo fare..

Grazie ancora alex.75!
Registrato

Chi fa domande rischia di sembrare stupido, chi non le fa rischia di restare stupido.
GiovanniD
Jr. Member
**

Karma: +5/-0
Scollegato Scollegato

Messaggi: 146



Mostra profilo WWW
« Risposta #7 inserita:: Febbraio 16, 2010, 12:36:27 pm »

(Giovanni, mi sono perso qualcosa?), io se non c'è reale necessità di "effettuare operazioni" in base all'item corrente, eviterei di scomodare il DataBound dello stesso.
Così facendo la gestione del codice riguardante la griglia rimane in un posto solo.
Più che altro me la son persa io Sorriso
stavo lavorando con i Response.write e me lo son portato dietro Felice Felice Felice cmq...ho corretto il codice.

Per il resto dipende...se hai dei controlli da fare mentre la gridview viene riempita...tipo se è X allora metti un'immagine se è Y allora ne metti un'altra e via discorrendo...come fai? Ci sono altri metodi che non includano il ricorrere a generarsi la tabella a mano? Sorriso
Registrato

alex.75
Jr. Member
**

Karma: +10/-1
Scollegato Scollegato

Messaggi: 222



Mostra profilo WWW
« Risposta #8 inserita:: Febbraio 16, 2010, 02:09:30 pm »

Come ho detto, per cose semplici basta richiamare un metodo che si occupa del "rendering", ad esempio sulla lista utenti ho una colonna con "smile" per utente "on-line", oppure "lucchetto chiuso" per utente bloccato, rimane vuota altrimenti. Ogni stato esclude l'altro.

<ItemTemplate><%# CreateImageOnLineOrLockout(((WebUser)Container.DataItem)) %></ItemTemplate>
Codice:
   protected string CreateImageOnLineOrLockout(WebUser webUser)
    {
        if (webUser.IsOnline)
        {
            return "<img src=\"Images/Icons/smile.gif\" alt=\"online\">";
        }
        else if(webUser.IsLockedOut)
        {
            return "<img src=\"Images/Icons/lock.gif\" style=\"vertical-align:middle\" alt=\"" + (string)GetLocalResourceObject("Blocked") + "\">";
        }        

        return "";
    }

In una situazione più complicata, griglia di prodotti di sito e-commerce/ricambi, ricorro al DataBound di ogni riga in cui verifico la tipologia di utente, se appartiene ad un certo ruolo, se ha crediti sufficienti, se il prodotto è disponibile, se appartiene alle sue competenze ecc... ecc...
In base a tali valori per ogni riga ed a valori precedentemente memorizzati (ha un listino assegnato, ha il fido bloccato... ) posso mostrare diverse "soluzioni".
E' chiaro che per tali operazioni il DataBound è d'obbligo.

In certe vecchie pagine (mi vergogno a dirlo) ho addirittura brutalmente impostato Visible = False per le colonne X e Y, con X e Y hard-coded nella pagina!

  
Codice:
protected void gridParts_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {

            if (base.RoleProperty.HasBasket)   /// create the textbox and icons for add spare part to basket
            {
                SparePart sparePart = (SparePart)e.Row.DataItem;

                if (webUser.RoleCode != Role.ROLE_CODE_BRANCH_SERVICE_CENTER)
                {
                    if (sparePart.Disponibility <= 0)
                    {
                        //Resources.General.Pieces_abbr
                        e.Row.Cells[COLUMN_INDEX_DISPONIBILITY].Controls.Add(new LiteralControl(ELEMENT_IMAGE_AVAILABILITY_OFF));
                    }
                    else
                    {
                        e.Row.Cells[COLUMN_INDEX_DISPONIBILITY].Controls.Add(new LiteralControl(ELEMENT_IMAGE_AVAILABILITY_ON));
                    }
                }

                if (sparePart.Price > 0)
                {
                    string textboxId = "q_" + e.Row.RowIndex;
                    string textbox = "<input type=\"text\" id=\"" + textboxId + "\" class=\"textbox w35\" />";
                    /// Todo: set spare part code in a hidden textbox
                    string js_basket_order = "addPart('" + Order.ORDER_TYPE_ORDER_CODE + "','" + HttpUtility.HtmlEncode(sparePart.Code) + "', '" + textboxId + "');";
                    string js_basket_estimate = "addPart('" + Order.ORDER_TYPE_ESTIMATE_CODE + "','" + HttpUtility.HtmlEncode(sparePart.Code) + "', '" + textboxId + "');";
                    string image_basket_order = "<img src=" + IMAGE_BASKET_ORDER + " onclick=\"" + js_basket_order + "\" class=\"hand\" />";
                    string image_basket_estimate = "<img src=" + IMAGE_BASKET_ESTIMATE + " onclick=\"" + js_basket_estimate + "\" class=\"hand\" />";
                    ((HtmlGenericControl)e.Row.FindControl("b")).InnerHtml = textbox + "&nbsp;" + image_basket_order + "&nbsp;" + image_basket_estimate;
                }
            }
        }
    }
Nell'esempio (terribile) qui sopra vengono aggiunti controlli in vario modo, sia tramite la sintassi  e.Row.Cells[COLUMN_INDEX],
sia con il più classico (e corretto) e.Row.FindControl(controlID).

Si rende però necessario usare controlli lato server (se possibile è meglio evitarli per rimanere più "leggeri") per poterli ricercare nell'evento, mentre con il modo di procedere esposto sopra si può evitare questa ricerca, posizionando la chiamata della funzione di render/format proprio nel punto in cui si vuole "scrivere" qualcosa.
<%# MetodoCheTornaUnaStringa() %> equivale a <%= MetodoCheTornaUnaStringa() %> che è quanto di più vicino ci sia a <% Response.Write() %>.

Ciò che fa realmente la differenza tra l'usare dei WebControl o meno è il fatto che questi persistono il loro stato (e valori) tra un post e l'altro, se invece si procede con un metodo "manuale" si perde tale vantaggio e si deve pensare al modo migliore per persistere i dati tra un post e l'altro (io solitamente sfrutto il Viestate).

Ma qui si chiedeva consiglio per una semplice griglia di immagini, stiamo andando fuori tema...

ciao

Registrato
GiovanniD
Jr. Member
**

Karma: +5/-0
Scollegato Scollegato

Messaggi: 146



Mostra profilo WWW
« Risposta #9 inserita:: Febbraio 16, 2010, 03:23:16 pm »

approccio interessante quello di ricorrere ai template
Registrato

Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2009 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page