lunes, 1 de julio de 2013

UPDATEPANEL con FILEUPLOAD E IMAGEBUTTON

COMPATIBILIDAD DEL UPDATE PANEL CON EL FILE UPLOAD E IMAGE BUTTON

Como sabemos que el FileUpload y el ImageButton no son compatibles con el UpdatePanel, una solución
que encontré para el primero se los dejo como ejemplo:
  
<asp:UpdatePanel ID="upCargarArchivos" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:Panel ID="pHeader" runat="server" CssClass="cpHeader">
<asp:Label ID="lblText" runat="server" />
</asp:Panel>
<asp:Panel ID="pBody" runat="server" CssClass="cpBody">
<table style="margin: auto">
<tr>
<td align="left">
<asp:FileUpload ID="fu" runat="server" Width="70%" EnableViewState="true" />
</td>
<td>
<asp:Button ID="btnRegistrarDocumento" runat="server" Text="Subir" OnClick="btnRegistrarDocumento_Click" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:GridView ID="gvArchivoIncidencia" runat="server" AutoGenerateColumns="False"
CellPadding="2" Font-Size="11px" Font-Names="Arial" Width="400px" EmptyDataText="No existen documentos asociados."
EnableTheming="True" ShowHeaderWhenEmpty="True" BackColor="White" BorderColor="#CCCCCC"
DataKeyNames="IdArchivoIncidencia" BorderStyle="None" BorderWidth="1px">
<Columns>
<asp:TemplateField HeaderText="Elim." ItemStyle-Width="40px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:ImageButton ID="ibtnEliminar" runat="server" OnClick="ibtnEliminar_Click" CommandArgument='<%# Eval("IdArchivoIncidencia") %>'
ImageUrl="~/img/delete.png" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Descar." ItemStyle-Width="40px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:ImageButton ID="ibtnDescargar" runat="server" OnClick="ibtnDescargar_Click"
CommandArgument='<%# Eval("IdArchivoIncidencia") %>' ImageUrl="~/img/down.png"
Height="18px" Width="18px" ImageAlign="AbsMiddle" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Archivo">
<ItemTemplate>
<asp:Label Font-Size="11px" Font-Names="Arial" CssClass="style4" ID="lblNombreArchivo"
runat="server" Text='<%# Bind("NombreArchivo") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="White" ForeColor="#000066" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" Height="30px" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#9dd9f5" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#F1F1F1" />
<SortedAscendingHeaderStyle BackColor="#007DBB" />
<SortedDescendingCellStyle BackColor="#CAC9C9" />
<SortedDescendingHeaderStyle BackColor="#00547E" />
</asp:GridView>
</td>
</tr>
</table>
</asp:Panel>
<asp:CollapsiblePanelExtender ID="CollapsiblePanelExtender1" runat="server" TargetControlID="pBody"
CollapseControlID="pHeader" ExpandControlID="pHeader" Collapsed="true" TextLabelID="lblText"
CollapsedText="SUBIR SUSTENTO" ExpandedText="SUBIR SUSTENTO"
CollapsedSize="0">
</asp:CollapsiblePanelExtender>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnRegistrarDocumento" />
</Triggers>
</asp:UpdatePanel>


 

Podemos observar en la parte de <Triggers> se agrega el elemento del botón Registrar Documento que interactua directamente con el fileupload con esto solucionamos  la compatibilidad entre el fileupload y el update panel.

        protected void btnRegistrarDocumento_Click(object sender, EventArgs e)
        {
            string str_mensaje, str_extension, str_nombre_archivo;
            if (fu.HasFile)
            {
                str_extension = System.IO.Path.GetExtension(fu.FileName);
                str_nombre_archivo = System.IO.Path.GetFileName(fu.FileName);
string ruta = System.AppDomain.CurrentDomain.BaseDirectory + "RepositorioIncidencias\\" + ftxtoctp.Text.Trim() + str_nombre_archivo;
                if (File.Exists(ruta))
                {
                    File.Delete(ruta);
                }
                fu.PostedFile.SaveAs(ruta);               
                objBSArchivoIncidencia.bcIngresarArchivoIncidencia(oENArchivoIncidencia);
            }
            else
            {
                str_mensaje = "Indique un archivo";
                string script = "<script language=Javascript>";
                script += "alert('" + str_mensaje + "');";
                script += "</script>";
                Page.ClientScript.RegisterStartupScript(GetType(), "script", script);
            }

        }

Ahora lo siguiente dentro de la grilla agregé dos ImageButton uno que elimina los registros y otra que descarga los documentos cargados, ocurre el mismo problema no descarga los elementos para solucionar esto debemos agregar la siguiente línea d ecódigo:

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(gvArchivoIncidencia);

Ahora si podremos llamar y descargar los documentos:

protected void ibtnDescargar_Click(object sender, ImageClickEventArgs ex)
        {
            ImageButton ibtn = (ImageButton)sender;
            int IdArchivoIncidencia = int.Parse(ibtn.CommandArgument);           
            string rutaArchivo = "";
            rutaArchivo = dt2.Rows[0][1].ToString();
            string nombreArchivo = "";
            nombreArchivo = dt2.Rows[0][2].ToString();
            string archivo = rutaArchivo;
            Response.AddHeader("Content-Disposition", "attachment; filename= " + nombreArchivo);
            Response.Flush();
            Response.Clear();
            Response.WriteFile(archivo);
            Response.End();

        }