Ciao a tutti.

Vorrei fare in modo che in una gridview fosse visualizzato (e funzionante) un ButtonField solo in particolari condizioni, ma no so bene come fare.
Ad esempio, se per quella riga della GridView è presente un file nel database, compaia un bottone per il download.

Avevo provato ad utilizzar il metodo RowDataBound della GridView nel modo seguente, ma anche se la visualizzazione è corretta quando clicco su uno dei qualsiasi bottoni presenti nella riga, mi esegue sempre il download del file csv, ignorando invece le altre azioni da eseguire.

 
protected void gvResult_RowDataBound(object sender, GridViewRowEventArgs e) { 
  string comID = (string)DataBinder.Eval(e.Row.DataItem, "comID"); 
   
  ImageButton imgBt = (ImageButton)e.Row.FindControl("imgDownloadCsv"); 
 
            if(imgBt != null) { 
                DbManager db = new DbManager();                 
                string nomeFileCsv = db.RetrieveFileNameClienti(comID); 
 
                if (!String.IsNullOrEmpty(nomeFileCsv)) { 
                    imgBt.ImageUrl = "~/images/txt.png"; 
                    imgBt.PostBackUrl = "~/handlers/RenderHandlerCsv.ashx?comID=" + comID + "&nomeFile=" + nomeFileCsv;  
                    imgBt.AlternateText = "Download file CSV"; 
                    imgBt.ToolTip = "Download file CSV"; 
                    imgBt.Visible = true; 
                } 
                else { 
                    imgBt.Visible = false; 
                } 
            } 
} 


Questo invece il codice della pagina aspx:

 
[...]
<asp:ButtonField ButtonType="Image" ImageUrl="~/images/info.png" 
                        Text="Aggiorna stato" CommandName="UpdateCommunicationState">
                    <ItemStyle Width="24px" />
                    </asp:ButtonField>
<asp:TemplateField> 
                        <ItemTemplate> 
                            <asp:ImageButton ID="imgDownloadCsv" runat="server" />             
                        </ItemTemplate> 
                    </asp:TemplateField> 

Modificato da andri745 il 26 agosto 2010 15.14 -
andri745 wrote:
Ciao a tutti.
Vorrei fare in modo che in una gridview fosse visualizzato (e funzionante) un ButtonField solo in particolari condizioni, ma no so bene come fare. Ad esempio, se per quella riga della GridView è presente un file nel database, compaia un bottone per il download.

è molto più semplice: colonna di tipo TemplateField, con controllo in fase di binding che ci sia q.sa da scaricare. ecco un esempio:

<asp:TemplateField>
<ItemTemplate>
<asp laceholder visibile='<%#CheckDownload((bool)Eval("HasDownload"))%>' runat="server">
....
</asp laceholder>
</ItemTemplate>
</asp:TemplateField>

ovviamente alla tua funzione CheckDownload puoi passare quello che ti pare per fare questo controllo. al posto di "...", un bel <a href=""> con il link al download
.

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
Cavolo non ci avevo pensato al placeholder... io facevo direttamente tutto sul bottone.
Comunque credo ci sia un baco nell'utilizzo che ho fatto sul metodo RowDataBound, in quanto ogni volta che cliccavo sul bottone, anche cliccando gi altri mi eseguiva sempre la stessa operazione. Stano...

Grazie del consiglio comunque!
Domanda: se invece del download dovessi eseguire un delete di quella riga sul db, come potrei fare?

Se scrivo ad esempio
<asp:TemplateField>
                        <ItemTemplate>        
                            <asp:PlaceHolder runat="server" Visible='<%# ViewDeleteButton((string)DataBinder.Eval(Container.DataItem, "comID"))%>'>                    
                                
                                    <asp:ImageButton ID="imgDeleteDraft" runat="server" ImageUrl="~/images/delete.png" OnClick="" CommandName="RemoveCommunication" Width="24px" />

                            </asp:PlaceHolder>                    
                        </ItemTemplate>
                    </asp:TemplateField>


anche se viene passato correttamente il CommandName, nel metodo GridView1_RowCommand il CommandArgument non è valorizzato, quindi non riesco ad eseguire nulla...
Nel tuo codice non hai impostato l'ID sul CommandArgument del button, ma sul PlaceHolder...

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
2.191 messaggi dal 30 novembre 2001
infatti devi valorizzare anche il CommandArgument del button:
CommandArgument='<%#Eval("comID") %>'
Grazie delle info. Si vede che oggi è venerdì... sono un po' suonato... :-)

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.