2011-04-26 20 views
31

He intentado vincular un objeto de Entity Framework a DataGridView, pero sigo llegando a callejones sin salida y parece que no puedo encontrar mi respuesta en ningún lado.Objetos de Binding Entity Framework en una Datagridview C#

puedo obligar a la totalidad de una tabla (entidad) a un gridview y me permite hacer cambios y guardar los cambios de nuevo a la base de datos de esta manera:

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 no quiero ver todas las columnas de la tabla en mi base de datos en mi DataGridView así que traté de 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 cualquier dato en mi DataGridView.

No puedo ver la madera de los árboles aquí. Por favor, ¿alguien podría mencionar nuestro error o decirme cuáles son las mejores prácticas para vincular EF con Winforms mientras me estoy drenando?

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

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

pero no sé qué.

+0

[Buena suerte.] (Http://stackoverflow.com/questions/5070990) –

Respuesta

38

El problema con la línea:

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

es que se está creando un anonymous type, y los tipos anónimos son inmutables - que es de sólo lectura. Es por eso que sus cambios no se reflejan ni en el nuevo tipo ni en el objeto EF original.

Ahora, en cuanto a las formas de no mostrar todas las columnas del objeto al que se está vinculando, he dado tres opciones a continuación.

Ocultar columnas no deseados

El enfoque más directo es establecer la propiedad visible en false para las columnas que no desee mostrar.

dataGridView1.Columns[0].Visible = false; 

Cuando el valor en el indizador colección columnas pueden ser o bien un número entero que especifica la ubicación de la columna o una cadena para el nombre de la columna.

objeto personalizado en EF para este enlace de datos

También podría manejar esto en la capa de EF - la creación de un objeto personalizado para su unión a la que se asigna EF de la base de datos sin las columnas que no desea. No he usado EF 4.0 realmente pero entiendo que ahora tiene esta capacidad.

personalizada DTO proyecta desde el objeto EF y luego mapea

La tercera opción (y estos van de bueno a malo en mi opinión de ellos, pero pensé que te lo diría algunos enfoques!) es consultar a un tipo concreto y luego volver al mapa del objeto EF. Algo 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, podría ser una solución viable también ...

+1

Hola David - Consideré el método oculto pero esperaba que hubiera una solución más limpia. Gracias por su respuesta –

+1

@David Hall: ¡Felicitaciones! gracias – CloudyMarble

+2

@David Hall: ¿cómo convertirías esta solución para su uso en MVVM? Estoy intentando trabajar en un ObservableCollection para poder notificar eventos PropertyChanged. ¡Gracias! – Rachael

Cuestiones relacionadas