32 votos

Unión de Entity Framework objetos a un Datagridview en C#

He estado tratando de enlazar una Entidad objeto de Framework a un DataGridView pero no dejo de golpear a callejones sin salida y me parece que no puede encontrar mi respuesta en cualquier lugar.

Me pueden obligar a la totalidad de una tabla (entidad) a un gridview y que me permitirá hacer cambios y guardar los cambios a la base de datos como este:

    WS_Model.WS_Entities context;

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        context = new WS_Entities();

        var query = from c in context.Users select c;

        var users = query.ToList();

        gridControl1.DataSource = users;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

pero yo no quiero ver todas las columnas de la tabla en mi base de datos en mi datagridview, así que he intentado hacerlo de esta manera...

WS_Entities context = new WS_Entities();

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        var query = from c in context.Users
                    where c.UserName == "James"
                    select new { c.UserName, c.Password, c.Description };

        var results = query.ToList();

        gridControl1.DataSource = results;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

pero ahora no puedo editar los datos en mi DataGridView.

Yo no puedo ver la madera de los árboles aquí - por favor a alguien en mente señalando el error de mi camino o me dice lo que las mejores prácticas sean para la unión de EF con Winforms como me estoy poniendo en fuga de cerebros.

Puedo ver que tiene que ver con la sección:

select new { c.UserName, c.Password, c.Description }

Pero no sé por qué.

38voto

David Hall Puntos 17450

El problema con la línea:

select new { c.UserName, c.Password, c.Description }

Es que es la creación de un tipo anónimo, y los tipos anónimos son inmutables - que es de sólo lectura. Esta es la razón por la que sus cambios no se reflejan en el nuevo tipo o en la EF original del objeto.

Ahora, en cuanto a maneras de no mostrar todas las columnas del objeto que son vinculantes, le he dado tres opciones de abajo.

Ocultar no deseadas de las columnas

El más recto hacia adelante enfoque es establecer la propiedad visible a false para las columnas que no quieres mostrar.

dataGridView1.Columns[0].Visible = false;

Donde el valor de la colección de Columnas de indizador puede ser un entero que especifica la columna de ubicación o una cadena para el nombre de la columna.

Objeto personalizado en EF para este enlace

Usted también podría manejar esta en la EF capa - crear un objeto personalizado para su unión a la que EF mapas de la base de datos sin las columnas que no quiere. No he utilizado EF 4.0 a todos los que realmente pero entiendo que tiene esta capacidad.

Personalizado DTO proyectada de EF objeto y, a continuación, asigna de nuevo

La tercera opción (y estos van de lo bueno a lo malo en mi opinión de ellos, pero he pensado que me gustaría decirte un par de enfoques!) es consultar a un tipo concreto y, a continuación, mapa de nuevo a la EF objeto. Algo así como:

private class DataBindingProjection
{
    public string UserName { get; set; };
    public string Password { get; set; };
    public string Description { get; set; };
}

private void simpleButton1_Click(object sender, EventArgs e)
{
    context = new WS_Entities();
    var query = from c in context.Users
                where c.UserName == "James"
                select new DataBindingProjection { UserName = c.UserName, Password = c.Password, Description = c.Description };
    var users = query.ToList();
    gridControl1.DataSource = users;
}

private void simpleButton2_Click(object sender, EventArgs e) 
{
    // and here you have some code to map the properties back from the 
    // projection objects to your datacontext

    context.SaveChanges();
}

En ciertas situaciones que podrían ser una solución viable demasiado...

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X