ButtonField in GridView

lunedì 20 aprile 2009 - 09.39

gae58 Profilo | Senior Member

salve,

ho una gridView, con varie colonne, una di queste, attraverso l'oggetto ButtonField, vorrei vusalizzare l'icond di Acrobat Reader e collegarla ad un nome di file presente nel dataBase.

<asp:ButtonField ButtonType="Image" DataTextFormatString="~/Public/Circolari/{0}"
HeaderText="Allegato" ImageUrl="~/app_Themes/pdf.png" Text="Allegato" DataTextField="NomeFile" />
a video funziona tutto bene e quando mi posiziono sull'icona il cursore si trasforma in manina, ma quando clicco, non mi apre il file in pdf.

Qualche suggerimento?

grazie


Gaetano

rossimarko Profilo | Guru

Ciao

un ButtonField scatena semplicemente un evento click che poi dovrai gestire...

Così a prima vista mi sembra che nel tuo caso ti serva un hyperlinkfield (http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.hyperlinkfield.aspx) che ti crea il collegamento al file per poterlo aprire
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

ti ringrazio per la risposta, con l'hyperlink l'ho provato e funziona, ma invece del nome del file vorrei far uscire l'icona pdf. Ma non ho capito come fare


Gaetano

rossimarko Profilo | Guru

Come hai definito l'hyperlink? Puoi sempre definire a mano il tuo template con un templatefield e impostando come itemtemplate un Hyperlink (all'interno dell'hyperlink puoi mettere un immagine)

<asp:Hyperlink ....><asp:Image ImageUrl="" /></asp:Hyperlink>

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

enrico.rm Profilo | Newbie

Io farei così:

<asp:GridView
..............
onrowcommand="grid_lista_ldv_RowCommand">
..............
<Columns>
..............
<asp:ButtonField ButtonType="Image" ImageUrl="~/app_Themes/pdf.png"
CommandName="apriPdf" />
</Columns>
</asp:GridView>

E poi ti gestisci l'argument da codice:

protected void grid_lista_ldv_RowCommand(object sender, GridViewCommandEventArgs e)
{
//qui ti gestisci l'apertura del file
}

Ciao

gae58 Profilo | Senior Member

Questo è l'hyperLink:
<asp:HyperLinkField DataTextField="NomeFile" HeaderImageUrl="~/app_Themes/pdf.png"
HeaderText="Dowload Circolare" Text="Dowload Circolare" DataNavigateUrlFields="NomeFile"
DataNavigateUrlFormatString="~/Public/Circolari/{0}" DataTextFormatString="{0:c}" />


Ti riferisci a qualcosa del genere?
<asp:TemplateField HeaderText="Allegato">
<ItemTemplate>
<asp:HyperLinkField DataTextField="NomeFile" HeaderImageUrl="~/app_Themes/pdf.png"
HeaderText="Dowload Circolare" Text="Dowload Circolare" DataNavigateUrlFields="NomeFile"
DataNavigateUrlFormatString="~/Public/Circolari/{0}" DataTextFormatString="{0:c}" >
<asp:Image ImageUrl=""></asp:image>
</asp:HyperLinkField
</ItemTemplate>
</asp:TemplateField>

però mi sottolinea sia HyperLink che Image


Gaetano

Ho anche notato che inserendo un template, non posso usare hyperlinkfields. Dove gli metto che deve aprirmi il file prendendo il nome dal campo del dataBase?

rossimarko Profilo | Guru

No, devi inserire una colonna TemplateField e poi usare direttamente il controllo Hyperlink come se fosse un normale controllo della pagina.

Ti faccio un piccolo esempio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

ti ringrazio. Funziona, l'esempio è stato chiarificatore dei miei dubbi.

Quindi, se ho ben capito, con una colonna templateField posso correlare + oggeti.

di nuovo grazie


Gaetano

rossimarko Profilo | Guru

Si, la colonna template field la puoi usare per creare un template completamente personalizzato, quindi in questi casi è molto comoda
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

ciao Marco,

scusa se riapro un vecchio thread, ma la domanda è simile.

Attraverso un Bottone, in una gridview, vorrei visualizzare i dati in una multiview di un'altra tabella collegata attraverso un controlParameter.

Spero di essere chiaro:
a) GridPadre
b) clicco su un'immagine (colonna) di qualsiasi riga della gridView e dovrebbe aprirsi la view con la grid che mi fa vedere i dati filtrati della grdiFiglia.

Per l'esempio che mi desti attraverso l'itemTemplate, ho imparato che attraverso il NavigateUrl='<%# "" %>', posso arpire una pagina web o richiamare un file pdf.

Stavolta, invece, devo passare dei parametri o delle istruzioni.
Ho letto su msdn che c'è la possibilità, nel rowCommand, di intercettare cosa si sceglie e da lì provvedere poi all'esecuzione del codice.
L'ho provato e funziona anche se in parte, in quanto non so ad un certo punto che comandi usare. Però vorrei sapere se è il metodo corretto.

grazie
Gaetano

rossimarko Profilo | Guru

Ciao,

una volta intercettato il rowcommand puoi prelevare i dati che ti servono dalla griglia dove hai cliccato il pulsante (ad esempio l'id della riga, basta usare la proprietà DataKeyField) e poi popolare l'altra griglia con quei dati.

Il problema immagino che sia il come popolare la seconda griglia, mi sembra di capire che stai usando un datasource definito direttamente nella pagina. Puoi pensare di popolare la seconda griglia direttamente da codice:
grid.DataSource = FunzioneCheRitornaiDati()
grid.DataBind()

Spero di aver capito bene il problema...
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

>una volta intercettato il rowcommand puoi prelevare i dati che
>ti servono dalla griglia dove hai cliccato il pulsante (ad esempio
>l'id della riga, basta usare la proprietà DataKeyField) e poi
>popolare l'altra griglia con quei dati.

Quindi la soluzione non è il rowCommand e non l'hyperlink.

Il secondo dataSource è collegato al primo con un progressivo ed ho inserito il parameter, avevo letto che c'era anche la proprietà dataCOmmandArgument per passare l'indice, però, giustamente, anche con il dataKeyName si può passare il dato.

>
>Il problema immagino che sia il come popolare la seconda griglia,
>mi sembra di capire che stai usando un datasource definito direttamente
>nella pagina. Puoi pensare di popolare la seconda griglia direttamente
>da codice:
>grid.DataSource = FunzioneCheRitornaiDati()
>grid.DataBind()
si anche questo è un problema.
Lavorerò su questo e ti farò sapere.

grazie


Gaetano

gae58 Profilo | Senior Member

ciao, ho impostato il buttonField come mi hai indicato ed ho notato che non non devo filttrare il rowset figio in quanto lo prende in automatico quando clikko sul bottone seleziona (questo pulsante mi apre una formView con i dettagli).
La questione è che non vorrei che prima seleziona il movimento e poi gli faccio vedere la grid figlia.
Che tu sappia c'è la possibilità di attribuire l'index al bottone scelto?

grazie


Gaetano

rossimarko Profilo | Guru

In che senso devi prima selezionare? Di solito quando metti un pulsante con commandName="select" all'interno della griglia seleziona in automatico la riga corrente
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

scusa non sono stato chiaro.

Nella griglia ho già un pulsante per la select e mi serve per richiamare la formView per l'inserimento e l'editazione.

Per la gestione dell'altro bottone, se utilizzo Select, mi apre la formView

cosa posso fare?


Gaetano

rossimarko Profilo | Guru

Allora imposta un altro commandname, e gestiscilo dal rowcommand. L'apertura in automatico dovrebbe avvenire solo per il commandname "Select"
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

ci avevo pensato, ma pur leggendo le indicazioni dell'help, non so come fare, richiamando il commandName a fargli leggere l'indice della griglia.
L'unica penso sia quello di fargli leggere il campo della griglia dove c'è il progressivo ed assegnarlo al parametro per il filtro, ma non so come fare


Gaetano

rossimarko Profilo | Guru

Se usi una templatecolumn e definisci nell'item template un command puoi impostare il command argument facendoti passare il valore che ti identifica il record:

<asp:Button id="btn" runat="server" CommandName="TuaOperazione" CommandArgument='<%# Eval("NomeCampoChiave") %>' Text="Operazione 2" />
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

gae58 Profilo | Senior Member

ciao MArco,

sei sttao preziosissimo, a livello di logico ci stavo arrivando, ma il comando non era quello giusto.

Ho realizzato quello che mi serviva e che volevo fare.

Adesso c'è la parte successiva da affrontare.

Di nuovo tante grazie


Gaetano

P.S.:
dimenticavo, per collegare la tabella figlia ho inserito il parametro di collegamento, indicando il selectIndexChanged della grid Padre. Ho dovuto togliere il control parameter, la sciando l'istruzione così:
<asp:Parameter Name="ProgressivoPa" />
è giusto o avrei dovuto lasciare il controlParameter e valorizzare il selectIndexChanged con il valore del commandArgument?

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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5