martes, 11 de septiembre de 2012

Editar GridView con DropDownList y RadioButton dentro de EditItemTemplate en ASP.NET

Bueno en este ejemplo explicare como editar un GridView con el DropDownList y RadioButton en el EditItemTemplate en ASP.NET con C#. Para esto creamos un proyecto web y agregamos un GridView, un SQLDataSource y un Label, al Label le borramos el texto:
configuramos el SQLDataSource para nuestra Base de Datos asi:
la cual contendra una tabla Details con los siguientes valores:
despues de todo esto vamos a la propiedad UpdateQuery para indicarle nuestra consulta:
ahora enlazamos nuestro GridView al SQLDataSource:
ahora nos vamos a la opcion Editar Columnas:
y las columnas ID, Sex y MaritalStatus de tipo BoundField las convierten en TemplateField las columnas convertidas deben quedarles asi:
y agregan una columna tipo CommandField para editar:
Ahora nos vamos a la Opcion Editar Plantillas:
una vez aqui seleccionamos la columna ID y en el label del ItemTemplate damos click en Editar Enlace de Datos, Personalizamos enlace y en Expresion de codigo ponemos Eval("ID") lo mismo con Sex y MaritalStatus, ahora en Sex en EditItemTemplate agregamos un RadioButton y lo personalizamos con las opciones Male, Female.
y lo mismo en MaritalStatus agregamos un DropDownList y lo personalizamos con las opciones Single and Married:
Finalmente dan click en Terminar Edicion de Plantilla. el codigo de la parte html desde el body mas o menos les quedara asi:
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataSourceID="SqlDataSource1" onrowdatabound="GridView1_RowDataBound" 
            onrowediting="GridView1_RowEditing" onrowupdated="GridView1_RowUpdated" 
            onrowupdating="GridView1_RowUpdating" DataKeyNames="ID">
            <Columns>
                <asp:TemplateField HeaderText="ID" SortExpression="ID">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:TemplateField HeaderText="Sex" SortExpression="Sex">
                    <EditItemTemplate>
                        <asp:RadioButtonList ID="RadioButtonList1" runat="server">
                            <asp:ListItem>Male</asp:ListItem>
                            <asp:ListItem>Female</asp:ListItem>
                        </asp:RadioButtonList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("Sex") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="MaritalStatus" SortExpression="MaritalStatus">
                    <EditItemTemplate>
                        <asp:DropDownList ID="DropDownList1" runat="server">
                            <asp:ListItem>Single</asp:ListItem>
                            <asp:ListItem>Married</asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("MaritalStatus") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="True" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
            SelectCommand="SELECT [ID], [Name], [Sex], [MaritalStatus] FROM [Details]" 
            UpdateCommand="UPDATE Details SET ID = @ID, Name = @Name, Sex = @Sex, MaritalStatus = @MaritalStatus Where [ID]=@ID">
            <UpdateParameters>
       <asp:Parameter Name="Name" />
       <asp:Parameter Name="Sex" />
       <asp:Parameter Name="ID" />
       <asp:Parameter Name="MaritalStatus" />
   </UpdateParameters>
        </asp:SqlDataSource>
        <br />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    
    </div>
    </form>
</body>
Los eventos que implementaran para GridView seran: RowDataBound,RowEditing, RowUpdating y RowUpdated.
y el codigo para manejar dichos eventos sera el de abajo:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        DataRowView dRowView = (DataRowView)e.Row.DataItem;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                RadioButtonList RadioButtonList1 = (RadioButtonList)e.Row.FindControl("RadioButtonList1");
                DropDownList DropDownList1 = (DropDownList)e.Row.FindControl("DropDownList1");
                RadioButtonList1.SelectedValue = dRowView[2].ToString();
                DropDownList1.SelectedValue = dRowView[3].ToString();
            }
        }
    }
    protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        Label1.Text = "Fila actualizada";
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        Label1.Text = "";
    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        RadioButtonList RadioButtonList1 = (RadioButtonList)GridView1.Rows[e.RowIndex].FindControl("RadioButtonList1");
        DropDownList DropDownList1 = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("DropDownList1");
        SqlDataSource1.UpdateParameters["Sex"].DefaultValue = RadioButtonList1.SelectedValue;
        SqlDataSource1.UpdateParameters["MaritalStatus"].DefaultValue = DropDownList1.SelectedValue;
    }
Y a la hora de ejecutar debe salirles asi:

lunes, 10 de septiembre de 2012

Subir archivos estilo Gmail con JQuery y AJAX en ASP.NET 2008

He visto siempre esta duda en muchos foros de asp.net como subir muchos archivos con estilo AJAX y ProgressBar similar al servicio Gmail de Google.
Y la respuesta es el plugin Uploadify para JQuery el cual hace lo mismo en simples pasos. Aqui explicare como hacerlo.
Paso 1
Descargar los plugins Uploadify de JQuery y la libreria JQuery de los links de abajo.
Download JQuery
Download Uploadify
Una vez que hayan descargado necesitaran ubicar estos 4 archivos:
  1. jquery-1.3.2.min.js
  2. jquery.uploadify.js
  3. uploader.fla

  4. uploader.swf
ponganlos en una carpeta llamada scripts en la misma ruta de su aplicacion web asp.net.
Paso 2 Abran Visual Studio, creen un proyecto web y añadan los archivos que descargaron debajo de la etiqueta de su codigo html
<link rel="Stylesheet" type="text/css" href="CSS/uploadify.css" />
     <script type="text/javascript" src="scripts/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="scripts/jquery.uploadify.js"></script>
Agregamos un control tipo FileUpload al proyecto:
Agreguen el siguiente script al final del codigo html
<script type = "text/javascript">
$(window).load(
    function() {
    $("#<%=FileUpload1.ClientID %>").fileUpload({
        'uploader': 'scripts/uploader.swf',
        'cancelImg': 'images/cancel.png',
        'buttonText': 'Browse Files',
        'script': 'Upload.ashx',
        'folder': 'uploads',
        'fileDesc': 'Image Files',
        'fileExt': '*.jpg;*.jpeg;*.gif;*.png',
        'multi': true,
        'auto': true
    });
   }
);
</script> 
Como puedes ver necesitamos especificar algunas configuraciones junto con el control FileUpload. La completa lista de configuraciones y sus descripciones estan disponibles aqui. Algo importante que tenemos que hacer es apuntar es 'script': 'Upload.ashx' el cual manejara el FileUpload y guardara los archivos subidos al disco duro. Abajo esta el codigo para el archivo Upload.ashx
<%@ WebHandler Language="C#" Class="Upload" %>

using System;
using System.Web;
using System.IO;

public class Upload : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Expires = -1;
        try
        {
            HttpPostedFile postedFile = context.Request.Files["Filedata"];
            
            string savepath = "";
            string tempPath = "";
            tempPath = System.Configuration.ConfigurationManager.AppSettings["FolderPath"]; 
            savepath = context.Server.MapPath(tempPath);
            string filename = postedFile.FileName;
            if (!Directory.Exists(savepath))
                Directory.CreateDirectory(savepath);

            postedFile.SaveAs(savepath + @"\" + filename);
            context.Response.Write(tempPath + "/" + filename);
            context.Response.StatusCode = 200;
        }
        catch (Exception ex)
        {
            context.Response.Write("Error: " + ex.Message);
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
}
Como veran ese manejador simplemente acepta los archivos subidos y guarda el archivo en la carpeta llamada uploads la cual crearemos dentro de la ruta raiz de nuestro directorio web. El web.config modificaremos la parte del appsettings como esta abajo:
<appSettings>
    <add key ="FolderPath" value ="uploads"/>
</appSettings >
Y listo al presionar F5 les saldra asi:
Como ven en la figura estos archivos se suben automaticamente una vez que los seleccionamos si no queremos de esta forma cambiamos la configuracion auto a false. Pero en ese caso tendran que crear un trigger de subir archivos para interactuar con el usuario por medio de un boton. Primero cambiamos la opcion a false aqui:
<script type = "text/javascript">
$(window).load(
    function() {
    $("#<%=FileUpload1.ClientID %>").fileUpload({
        'uploader': 'scripts/uploader.swf',
        'cancelImg': 'images/cancel.png',
        'buttonText': 'Browse Files',
        'script': 'Upload.ashx',
        'folder': 'uploads',
        'fileDesc': 'Image Files',
        'fileExt': '*.jpg;*.jpeg;*.gif;*.png',
        'multi': true,
        'auto': false
    });
   }
);
</script> 
luego agregamos este codigo debajo de la etiqueta form que desencadenara la subida de archivos:
<a href="javascript:$('#<%=FileUpload1.ClientID%>').fileUploadStart()">Start Upload</a>  
Si el usuario no da click en el boton los archivos estarn en lista pendientes a ser subidos. Con este codigo se limpiara la lista una vez subidos los archivos:
 <a href="javascript:$('#<%=FileUpload1.ClientID%>').fileUploadClearQueue()">Clear</a> 
aqui pueden descargar el codigo de la aplicacion espero les sea util =) MultipleFilesUpload.zip (57.08 kb)

domingo, 9 de septiembre de 2012

Subir muchos archivos con FileUpload o JQuery en ASP.NET

En este pequeño post explicare como subir muchos archivos con FileUpload o JQuery en ASP.NET.
He puesto 4 controles tipo FileUpload y un boton en la pagina, el codigo para subir los archivos al servidor esta escrito en el evento Click del boton.
Para este proyecto descargamos JQuery.js y jQuery.MultiFile.js del sitio JQuery multiple-file-upload plugin site.
El tamaño limite por defecto es 4 mb pero podemos subir archivos de mayor tamaño cambiando la configuracion en el web.config.
El diseño de la pagina sera mas o menos el siguiente:
como se ve hay controles tipo File Upload y el resto que son buttons y label. El codigo html es el siguiente:
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<br />
<asp:FileUpload ID="FileUpload2" runat="server" />
<br />
<asp:FileUpload ID="FileUpload3" runat="server" />
<br />
<asp:FileUpload ID="FileUpload4" runat="server" />
</div>         
  
<asp:Button ID="btnUpload" runat="server" 
            onclick="btnUpload_Click" 
            Text="Upload Files"/><br /><br />
<asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
<div>
<p>Upload Files Using JQuery</p>
<asp:FileUpload ID="FileUploadJquery" 
                runat="server" 
                class="multi"/>
<br /><br />
<asp:Button ID="btnJqueryMultipleFiles" 
            runat="server" Text="Upload Files Using Jquery" 
            onclick="btnJqueryMultipleFiles_Click"/>
</div>
</form>
No olviden agregar los 2 javascripts que les mencione arriba esos iran en su proyecto:
Los scripts los agregan despues del head como sigue:
<head runat="server">
    <title></title>
    <script src="jquery.js" type="text/javascript"></script>
    <script src="jquery.MultiFile.js" type="text/javascript"></script>
   
</head>
agregan este namespace en el codigo:
using System.IO;
este codigo es para una subida normal:
HttpFileCollection uploads = Request.Files;
        for (int fileCount = 0; fileCount < uploads.Count; fileCount++)
        {
            HttpPostedFile uploadedFile = uploads[fileCount];
            string fileName = Path.GetFileName(uploadedFile.FileName);
            if (uploadedFile.ContentLength > 0 )
            {
                uploadedFile.SaveAs(Server.MapPath("~/Files/") + fileName);
                lblMessage.Text += fileName + " Uploaded 
"; } }
y el codigo de abajo es para una subida con JQuery(lo colocan ambos codigos dentro del evento click):
HttpFileCollection uploads = Request.Files;
        for (int fileCount = 0; fileCount < uploads.Count; fileCount++)
        {
            HttpPostedFile uploadedFile = uploads[fileCount];
            string fileName = Path.GetFileName(uploadedFile.FileName);
            if (uploadedFile.ContentLength > 0)
            {
                uploadedFile.SaveAs(Server.MapPath("~/Files/") + fileName);
                lblMessage.Text += fileName + "Uploaded 
"; } }
Y al ejecutar nuestro codigo saldra asi:
vamos a la carpeta files de nuestro proyecto y ahi se encontraran los archivos que hayamos subido, y si lo hacen con el boton de JQuery saldra igual solo que para no ahcer pesado el gif lo probe con el primero =)

Subir multiples archivos en Asp.Net usando Control AjaxFileUpload, Drag & Drop y Progress Bar

Este ejemplo explica como utilizar el Control AjaxFileUpload con Drag Drop y Progress Bar en ASP.NET.
En mayo de este año AjaxControlToolkit incluye un nuevo control AjaxFileUpload el cual soporta multiples subidas de archivos, progressbar y la funcionalidad Drag and Drop.
Estas nuevas caracteristicas son soportadas por Google Chrome version 16+, Firefox 8+ , Safari 5+ and Internet explorer 10 + , IE9 o versiones anteriores no soportan estas caracteristicas.
Para empezar con esto, descargamos y agregamos el ultimo AjaxControlToolkit.dll en la carpeta Bin de nuestra aplicacion, luego agregamos el control ToolkitScriptManager y AjaxFileUpload a la pagina.
<style>
.modalBackground
{
 background-color: Gray;
 filter: alpha(opacity=50);
 opacity: 0.50;
}
.pnl{
 background: #333;
 padding: 10px;  
 border: 2px solid #ddd;
 float: left;
 font-size: 1.2em;
 color:White;
 position: fixed;
 top: 50%; left: 50%;
 z-index: 99999;
 box-shadow: 0px 0px 20px #999; /* CSS3 */
        -moz-box-shadow: 0px 0px 20px #999; /* Firefox */
        -webkit-box-shadow: 0px 0px 20px #999; /* Safari, Chrome */
 border-radius:3px 3px 3px 3px;
        -moz-border-radius: 3px; /* Firefox */
        -webkit-border-radius: 3px; /* Safari, Chrome */
}
.close { 
    DISPLAY: block;BACKGROUND: url(Images/close.png) no-repeat 0px 0px; 
    LEFT: -12px;WIDTH: 26px;TEXT-INDENT: -1000em;POSITION: absolute; 
    TOP: -12px;HEIGHT: 26px; 
}  
</style>
<script type = "text/javascript">
    function Success() {
        document.getElementById("lblMessage").innerHTML = "File Uploaded";
        
    }
 
    function Error() {
         document.getElementById("lblMessage").innerHTML = "Upload failed.";
    }
</script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="btnUpload" runat="server" 
            Text="Upload File" onclick="btnUpload_Click"/>
            
<asp:ModalPopupExtender runat="server" 
                        ID="modelPopupExtender1" 
                        TargetControlID="btnUpload"
                        PopupControlID="popUpPanel" 
                        OkControlID="btOK" 
                        BackgroundCssClass="modalBackground">
</asp:ModalPopupExtender>

 <asp:Panel ID="popUpPanel" runat="server" CssClass="pnl">
 <div style="font-weight: bold; border: Solid 3px Aqua; 
                                background-color: AliceBlue">
 
 <asp:AjaxFileUpload ID="AjaxFileUpload1" runat="server" 
                     OnUploadComplete="UploadComplete" 
                     OnClientUploadComplete="Success" 
                     ThrobberID="loader" Width="400px"/>
 <asp:Image ID="loader" runat="server" 
            ImageUrl ="~/loading.gif" 
            Style="display:None"/>
 </div><br /><br />
 <asp:Label ID="lblMessage" runat="server"/><br /><br />
 <asp:Button ID="btOK" runat="server" Text="OK" />
 <asp:LinkButton ID="LinkButton1" runat="server" CssClass="close" 
 OnClientClick="$find('modelPopupExtender1').hide(); return false;"/>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
    
    </div>
    <br /><br />
    
    </form>
</body>
La propiedad ThrobberID del control AjaxFileUpload es utilizado para mostrar la imagen de cargando en vez de progress bar si el navegador no lo soportara.
Algunos tipos de archivos pueden ser restringidos utilizando la propiedad AllowedFileTypes separados con comas de la siguiente forma "zip,doc,pdf".
El codigo de abajo es para el evento OnUploadComplete que guarda el archivo y lo enlazaremos al control AjaxFileUpload.
protected void UploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
    {
        string filePath = "~/Images/" + e.FileName;
        AjaxFileUpload1.SaveAs(MapPath(filePath));
    }
el boton que nos aparece al cargar el proyecto es para abrir la ventana la cual subira los archivos a la carpeta Images por la ruta que le indicamos en filePath. Espero les haya servido el ejemplo. Pueden descargar el codigo aqui

JQuery UI Ajax Autocompletar TextBox con Base de Datos en ASP.NET usando WebService

Para lograr esto utilize la base de datos AdventureWorks y la tabla Person.Contact, bueno mas abajo veran esta conexion, lo primero que haremos sera crear un proyecto web en C# y agregan este codigo en la hoja de codigo de la parte html:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Página sin título</title>
    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script> 
                <script type="text/javascript">
                    $(document).ready(function() {
                        SearchText();
                    });
                    function SearchText() {
                        $(".auto").autocomplete({
                            source: function(request, response) {
                                $.ajax({
                                    type: "POST",
                                    contentType: "application/json; charset=utf-8",
                                    url: "Default.aspx/GetAutoCompleteData",
                                    data: "{'FirstName':'" + document.getElementById('FirstName').value + "'}",
                                    dataType: "json",
                                    success: function(data) {
                                        response(data.d);
                                    },
                                    error: function(result) {
                                        alert("Error Occurred");
                                    }
                                });
                            }
                        });
                    }
                </script>
</head>
<body>
    <form id="form1" runat="server">
   <div class="demo">
<div class="ui-widget">
    <label for="tbAuto">Ingrese un nombre: </label>
   <input type="text" id="FirstName" class="auto" />
</div></div>
    </form>
</body>
</html>
Mas o menos se vera asi:
Como ven en el codigo de la cabecera de arriba agregue algunos scripts y archivos CSS esto para tener la opcion de mostrar el autocompletado con estilo css. Para conseguir estos archivos agreguen estas URLS a su aplicacion.
Otra cosa que necesitamos saber es la funcion script en la seccion header.
$(".auto").autocomplete({
                            source: function(request, response) {
                                $.ajax({
                                    type: "POST",
                                    contentType: "application/json; charset=utf-8",
                                    url: "Default.aspx/GetAutoCompleteData",
                                    data: "{'FirstName':'" + document.getElementById('FirstName').value + "'}",
                                    dataType: "json",
                                    success: function(data) {
                                        response(data.d);
                                    },
                                    error: function(result) {
                                        alert("Error Occurred");
                                    }
                                });
                            }
                        });
Esta declaracion de la funcion de formato JSON que estamos usando es para llamar a los metodos web usando JQuery $.ajax() cuando queramos llamar a Ajax con JQuery usaremos funciones JSON con el formato de arriba.
Los atributos ContentType y dataType son los mismos para todas las funciones solo url, data y success function variaran basadas en nuestra peticion.
url: Esta es la ruta para nuestros metodos Web
data: Pasaremos parametros utilizando este parametro sino pasamos ninguno entonces en data pondremos: "{}".
Hay un detalle JSON es sensible a mayusculas asi que sean cuidadosis antes de escribir el formato de data JSON.
Ahora abran la hoja de codigo y agreguen los siguientes namespaces:
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Services;
Luego agregan el siguiente codigo en C#
[WebMethod]

    public static List GetAutoCompleteData(string FirstName)
    {
        List result = new List();
        using (SqlConnection con = new SqlConnection("Data Source=XSaint;Integrated Security=true;Initial Catalog=AdventureWorks"))
        {
            using (SqlCommand cmd = new SqlCommand("select distinct FirstName from Person.Contact where FirstName LIKE '%'+@FirstName+'%'", con))
            {
                con.Open();
                cmd.Parameters.AddWithValue("@FirstName", FirstName);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    result.Add(dr["FirstName"].ToString());
                }
                return result;
            }
        }
    } 
Luego presionen F5 y el resultado sera asi:

Mostrar un archivo Excel 2003, 2007 en GridView en ASP.NET 2008 con OleDbDataAdapter

He visto muchos ejemplos de como hacer esto pero algunos no funcionan jeje asi que aqui comparto este codigo que si funciona ya sea el archivo excel en diferentes versiones 1997, 2003 o 2007. Lo primero que haremos sera pulsar el boton examinar, buscamos el archivo excel luego lo copiaremos ese archivo al directorio web y de alli crearemos el enlace de la hoja de excel al gridview.
Lo primero sera crear un proyecto web y agregar un scriptmanager, un uploadpanel y dentro de el al gridview para refrescar esa parte y no toda la pagina, tambien agregamos un control FileUpload, un boton y un Label debajo. Estos 3 ultimos controles podemos ponerlos dentro de una tabla y los 2 primeros dentro del grid, personalizando al gridview para darle mayor vistocidad lucira asi:
el codigo que tendra nuestro body sera mas o menos el siguiente:
<body>
    <form id="form1" runat="server">
    <div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" CellPadding="4"
Font-Names="Verdana" Font-Size="Small" ForeColor="#333333">
<RowStyle BackColor="#EFF3FB" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#2461BF" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<table>
<tr>
<td><asp:FileUpload ID="fupExcel" runat="server" Font-Names="Verdana"
Font-Size="Small" /></td>
</tr>
<tr>
<td><asp:Button ID="btnUpload" runat="server" Text="Upload" Font-Names="Verdana"
Font-Size="Small" onclick="btnUpload_Click" /></td>
</tr>
<tr>
<td>
    <asp:Label ID="Label1" runat="server"></asp:Label>
    </td>
</tr>
</table>
</div>
    </form>
</body>
para nuestro codigo importamos las siguientes librerias:
using System.Data.OleDb;
using System.IO;
olvide decirles antes de escribir el codigo de abajo para subir el excel, creen una carpeta llamada Invoices dentro de su proyecto, en la misma ruta donde esta su web default1.aspx ya que esta carpeta es la que nos servira para crear el enlace. Una vez dicho esto escriban este codigo dentro del evento click del boton Upload.
if (fupExcel.HasFile)
        {
            try
            {
                HttpFileCollection uploads = HttpContext.Current.Request.Files;
                for (int i = 0; i < uploads.Count; i++)
                {
                    HttpPostedFile upload = uploads[i];
                    if (upload.ContentLength == 0)
                        continue;
                    string c = System.IO.Path.GetFileName(upload.FileName);
                    try
                    {
                        upload.SaveAs(Server.MapPath("Invoices\\") + c);
                    }
                    catch (Exception Exp)
                    {
                        throw (Exp);
                    }
                }
                if (fupExcel.PostedFile != null)
                {
                    HttpPostedFile attFile = fupExcel.PostedFile;
                    int attachFileLength = attFile.ContentLength;
                    if (attachFileLength > 0)
                    {
                        if (fupExcel.PostedFile.ContentLength > 0)
                        {
                            string Extension = Path.GetExtension(fupExcel.PostedFile.FileName);
                            string inFileName = Path.GetFileName(fupExcel.PostedFile.FileName);
                            string pathDataSource = Server.MapPath("Invoices\\") + inFileName;

                            string conStr = "";
                            if (Extension == ".xls" || Extension == ".xlsx")
                            {
                                switch (Extension)
                                {
                                    case ".xls": //Excel 1997-2003
                                        conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + pathDataSource.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    case ".xlsx": //Excel 2007
                                        conStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fupExcel.PostedFile.FileName.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    default:
                                        break;
                                }

                                OleDbConnection connExcel = new OleDbConnection(conStr.ToString());
                                OleDbCommand cmdExcel = new OleDbCommand();
                                OleDbDataAdapter oda = new OleDbDataAdapter();
                                DataTable dt = new DataTable();
                                connExcel.Open();
                                DataSet ds = new DataSet();
                                //Selecting Values from the first sheet
                                //Sheet name must be as Sheet1
                                OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Members$]", conStr.ToString());
                                da.Fill(ds);
                                GridView1.DataSource = ds;
                                GridView1.DataBind();
                                if (GridView1.Columns.Count > 0)
                                {
                                }
                                connExcel.Close();
                                if (File.Exists(pathDataSource))
                                {
                                    File.Delete(pathDataSource);
                                }
                            }
                            else
                            {
                                //Show your error in any error controls
                            }
                        }
                        else
                        {
                            fupExcel.Focus();
                            GridView1.DataSource = null;
                            GridView1.DataBind();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        else
            Label1.Text = "Seleccione un archivo";
la variable fupexcel es el control FileUpload que les mencione en un principio. El primer if es para el caso que se presione el boton Upload sin haber seleccionado el archivo Excel. Presionen F5 y les saldra asi:

Exportar data de gridview a PDF en ASP.NET 2008 con ItextSharp

En otros post he puesto ejemplos de como crear un word o un excel a partir de un gridview. Ahora haremos lo mismo para convertir a PDF ya que en ASP.NET no tenemos una caracteristica directa para exportar data del gridview a PDF por esa razon aqui voy a usar una referencia a la libreria ITextSharp. La dll esta disponible busquenla con este nombre itextsharp.dll, crean un proyecto web en visual studio y agregan la referencia al dll asi.
Lo seleccionamos y pulsamos Aceptar.
Ahora en nuestra hoja agregamos una tabla de 2 filas y una columna, en la primera fila agregamos un control ImageButton y en el segundo agregamos un GridView. A nuestro ImageButton le vamos a dar de fondo una imagen PDF para que se vea mas amigable para el usuario, luciendo asi:
para darle este fondo vana la propiedad imageUrl y seleccionan la imagen que debe estar dentro de su proyecto. A nuestro GridView en las propiedades AllowPaging y AllowSorting las ponemos en true y AutoGenerateColumns lo ponemos en false.
Ahora agregamos un SQLDataSource debajo de nuestro gridview:
Configuramos origen de datos y para este ejemplo utilizaremos los campos CompanyName, ContactName, ContactTitle y Address de la tabla Suppliers de la Base Northwind. Pueden hacer select * desde el DataSource, enlazamos al gridview en la propiedad DataSourceID y luego eliminamos las columnas que no deseamos:
Editamos nuestra cadena de conexion del Web.config

        
    
ahora a nuestra ventana de codigo agregamos estas referencias:
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;

y agregan este codigo debajo del load:
public override void VerifyRenderingInServerForm(Control control)
    {
        /* Verifies that the control is rendered */
    }
    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=UserDetails.pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        StringWriter sw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
 hw.Write("<b><u>Employee Information</u></b><br/> <br/>");
        GridView1.AllowPaging = false;
        GridView1.DataBind();
        GridView1.RenderControl(hw);
        GridView1.HeaderRow.Style.Add("width", "15%");
        GridView1.HeaderRow.Style.Add("font-size", "10px");
        GridView1.Style.Add("text-decoration", "none");
        GridView1.Style.Add("font-family", "Arial, Helvetica, sans-serif;");
        GridView1.Style.Add("font-size", "8px");
        StringReader sr = new StringReader(sw.ToString());
        Document pdfDoc = new Document(PageSize.A4, 18f, 18f, 18f, 18f);
        HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
        PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
        pdfDoc.Open();
        htmlparser.Parse(sr);
        pdfDoc.Close();
        Response.Write(pdfDoc);
        Response.End();
    }
para este ejemplo descargue el itextsharp.dll la version 4.1.2.0. Se agrego la funcion VerifyRenderingInServerForm para evitar que aparezca este error RegisterForEventValidation can only be called during Render();. Espero les haya servido el codigo.