[ASP.NET] Añadir un campo de tipo HyperLink a un GridView

Me ha llegado una petición a través del blog para ver como se puede insertar un campo de tipo HyperLink a un GridView y me he montado un ejemplo sencillo que podéis descargar aquí

Sí ejecutáis el proyecto saldrá algo como esto:

image

Vamo a ver como lo he hecho:

Lo primero es decirle al GridView que no genere la columnas automáticamente:

<asp:GridView ID="GridView" AutoGenerateColumns="false" runat="server">

Y luego añadir una columna de tipo HyperLinkField a la colección de columnas del GridView:

<Columns>

    <asp:HyperLinkField 

        HeaderText="Url"

        DataTextField="Url"

        datanavigateurlfields="Url"

        Target="_blank" />

</Columns>

Como podéis observar son cuatro propiedades:

  • HeaderText: Encabezado de la columna.
  • DataTextField: Campo que queremos que se muestre como texto del link (en mi caso la Url)
  • DataNavigateUrlFields: Campo que contiene la Url
  • Target: Como queremos que se abra el link, en la misma página, en otra nueva…

Espero que os sirva.

Un saludo

[EF 4.0] Trabajando con Stored Procedures (SQL Server)

Ayer estuve haciendo una prueba de concepto en casa para ver como EF 4.0 trabaja con los StoredProcedures y he decidido escribir sobre la experiencia. Todo el material lo tenéis disponible en este zip para descargar junto con un backup de la base de datos.

Lo primero de todo vamos a crear la base de datos a la que llamaremos HumanResources

image

que contendrá una única tabla Employee:

image

Lo siguiente será crear los procedimiento almacenados para insertar, borrar y modificar y sellecionar clientes, para ello basta con lanzar los siguientes scripts SQL:

Insert

USE [HumanResources]

GO

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE PROCEDURE [dbo].[InsertEmployee]

    @Id uniqueidentifier,

    @FirstName nvarchar(50),

    @LastName nvarchar(50),

    @Email nvarchar(100)

AS

    BEGIN

 

        INSERT INTO Employee

        (

            [Id],

            [FirstName],

            [LastName],

            [Email]

        )

        VALUES

        (

            @Id,

            @FirstName,

            @LastName,

            @Email

        )

    END

 

GO

Update

USE [HumanResources]

GO

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE PROCEDURE [dbo].[UpdateEmployee]

    (

    @Id uniqueidentifier,

    @FirstName nvarchar(50),

    @LastName nvarchar(50),

    @Email nvarchar(100)

    )

    

AS

    BEGIN

        UPDATE Employee

        SET 

            [Firstname] = @Firstname,

            [LastName] = @LastName,

            [Email] = @Email

        WHERE 

            [Id] = @Id

    END

 

GO

Delete

USE [HumanResources]

GO

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE PROCEDURE [dbo].[DeleteEmployee]

    (

    @Id uniqueidentifier

    )

AS

    BEGIN

 

    DELETE FROM Employee WHERE Id = @Id

 

    END

 

GO

Select

USE [HumanResources]

GO

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE PROCEDURE [dbo].[SelectEmployees]

 

AS

    BEGIN

 

    SELECT 

        Id,

        FirstName,

        LastName,

        Email

    FROM

        Employee

    END

 

GO

Abrimos Visual Studio 2010 y vamos a crear un proyecto de WinForms al que yo he llamado EFDemoStoreProcedure y añadimos un ADO.NET Entity Data Model al que llamaremos HumanResources.edmx

image

A continuación nos aparecerá un wizard, seleccionamos Generate from database y pulsamos siguiente:

image

Sino tenemos la cadena de conexión configurada (en mi caso ya tenía una cadena de conexión creada) Pulsamos en el botón New Connection

image

Y rellenamos la ventana tal cual se muestra en la imagen

image

En la siguiente ventana, elegimos la tabla Employee y lo demás lo dejamos tal cual se muestra en la imagen:

image

Una vez hecho esto, pulsamos en el botón Finish y ya tenemos nuestro modelo generado:

image

Lo siguiente que vamos a hacer es los mapeos con los procedimientos almacenados, botón derecho sobre la entidad Employee y seleccionamos Stored Procedure Mapping

image

y nos aparece la siguiente ventana:

image

Ahora seleccionamos <Select Insert Function> y nos aparecerán nuestro procedimientos alamacenados y elegimos InsertEmployee

image

Y a continuación podemos ver los mapeos de los campos de la entidad Employee con los parámetros del procedimiento almacenado, sí algún mapeo está incorrecto podemos cambiarlos, borrarlos…

image

Repetimos esta operación para la función Update y Delete. Ahora toca probar sí todo esto funciona correctamente.

Añadimos 4 botones al formulario y un listbox:

image

Al botón Insert Employee, en su evento Click añadimos el siguiente código:

using (var context = new HumanResourcesEntities())

{

    var ticks = DateTime.Now.Ticks;

 

    var employee = new Employee

                       {

                           Id = Guid.NewGuid(),

                           FirstName = String.Format(

                               "FirstName_{0}",

                               ticks),

                           LastName = String.Format(

                               "LastName_{0}",

                               ticks),

                           Email = String.Format(

                               "Email@{0}.com",

                               ticks)

                       };

 

    context.Employees.AddObject(employee);

    context.SaveChanges();

 

    MessageBox.Show(Resources.Form1_BtnInsertEmployeeClick_Employee_inserted);

}

Al botón Update Employee, en su evento Click añadimos el siguiente código:

if (lstEmployees.SelectedItem == null)

    return;

 

var id = (Guid)lstEmployees.SelectedItem;

 

using (var context = new HumanResourcesEntities())

{

    var employee = context.Employees.Where(u => u.Id == id).FirstOrDefault();

 

    if (employee == null) 

        return;

 

    employee.FirstName = "Name modified!";

    context.SaveChanges();

    MessageBox.Show(Resources.Form1_BtnUpdateEmployeeClick_Employee_updated);

}

 
Al botón Delete Employee, en su evento Click añadimos el siguiente código:
 
if (lstEmployees.SelectedItem == null)

    return;

 

var id = (Guid)lstEmployees.SelectedItem;

 

using (var context = new HumanResourcesEntities())

{

    var employee = context.Employees.Where(u => u.Id == id).FirstOrDefault();

 

    if (employee == null)

        return;

    

    context.DeleteObject(employee);

    context.SaveChanges();

    GetEmployees();

}

 

MessageBox.Show(Resources.Form1_BtnDeleteEmployeeClick_Employee_deleted);

 
Arrancamos la aplicación de ejemplo o la que se encuentra en el zip (Ponemos el profiler de SQL Server sí queremos ver las sentencias que se ejecutan) y probamos a añadir un empleado.
 
Comose aprecia en la imagen, vemos que se está ejecutando el procedimiento almacenado InsertEmployee y los parámetros con los que se le está llamando:

image

El registro en la tabla:

image

Por último nos faltaría seleccionar los empleados que tenemos en la base de datos, para ello tenemos que ir al Model Browser

image

Botón derecho sobre el procedimiento almacenado SelectEmployees y pulsamos en Add Function Import

image

Seguidamente, ponemos el nombre a la función, el procedimiento almacenado al que se refiere y seleccionamos la opción Entities de Return a Collection Of para que nos devuelva una colección de Employee

image

Con esto nuestro contexto ya tiene un método para devolver un listado de los empleados, así que en el evento Click del botón Get Employee ponemos el siguiente código:

using (var context = new HumanResourcesEntities())

{

    var employees = context.SelectEmployees();

 

    foreach (var employee in employees)

    {

        lstEmployees.Items.Add(employee.Id);

    }

}

Y ya nos devuelve los empleados:

image

Espero que os resulte útil.

Un saludo.

[MOSS 2010] Could not load XSL file. The system cannot find the file specified.

Esta entrada es para recordarme a mí mismo que cuando haga un provisioning de un site, acordarme antes de activar la característica de SharePoint Server Publishing Infrastructure en las características de colección de sitios para no encontrarme con este error al provisionar SummaryLinks, CQWP…:

image

Editamos el WebPart

image

Y el famoso error:

image

Ale! ya no se me vuelve a olvidar Smile

 

Un saludo y buen finde a todos.

[MOSS 2010] Añadir ensamblados a nuestra solución con VS 2010 para que se desplieguen en la GAC

Sí queremos que se despliguen dlls a la GAC cuando despleguemos nuestra solución (*.wsp) en un servidor, tenemos que seguir estos pasos:

Hacemos doble click sobre Package.package:

image

En la ventana de configuración que nos aparace, en la parte de abajo, pinchamos sobre Advanced:

image

En la siguiente ventana, pinchamos sobre el botón Add:

image

Podemos añadir una assembly existente o como en mi caso una dll de otro proyecto que tengo en la solución:

image

Seleccionamos el proyecto (En mi caso una librería de Receivers)

image

El la opción Deployment Target, le especificamos que lo despligue en la GAC

image

Una vez hecho esto, ya la tenemos en el listado:

image

Un saludo

[MOSS2010] The local farm is not accessible. Cmdlets with FeatureDependencyId are not registered

Estoy trabajando en un proyecto de Sharepoint 2010 con mi compañero Alfredo y me ha creado una cuenta de administrador en nuestro entorno de PRE-Producción. Necesitaba lanzar un script de PowerShell para realizar unas tareas y me he encontrado este error:

image

Para solucionarlo, basta con abrir el SQL Server Management Studio –> Security –> Logins, seleccionar el usuario, pinchar sobre User Mapping y seleccionar la base de datos SharePoint_Config y seleccionar el rol SharePoint_Shell_Access

image

image

Salu2 Smile