Mostrar propiedades de una propiedad de navegación en DataGridView (Propiedades de segundo nivel)

Mostrar propiedades de una propiedad de navegación en DataGridView (Propiedades de segundo nivel)

Puede utilizar cualquiera de estas opciones:

  1. Usar DataGridViewComboBoxColumn
  2. Agregue las propiedades correspondientes a la clase parcial de entidad secundaria
  3. Dé forma a la consulta para incluir propiedades de propiedad de navegación usando Linq
  4. Usar CellFormatting evento para obtener el valor de las columnas delimitadas por subpropiedades
  5. Mostrar la representación de cadena del objeto anulando ToString()
  6. Utilice un TypeDescriptor personalizado para habilitar el enlace de datos a las subpropiedades.

Opción 1:usar DataGridViewComboBoxColumn

Uso: Este enfoque sería útil especialmente en casos en los que desea mantener el control editable.

En este enfoque, puede usar DataGridViewComboBoxColumn para mostrar cualquier campo de propiedad de navegación. Para mostrar múltiples subpropiedades de campo de la propiedad de navegación en la cuadrícula, use múltiples DataGridViewComboBoxColumn vinculado a la misma propiedad de navegación con diferentes DisplayMember

En este enfoque, adicional a su ProductId columna, agregue más DataGridViewComboBoxColumn a la cuadrícula y luego realice esta configuración para todas las columnas combinadas adicionales:

  • Establecer DataPropertyName de ellos a ProductId
  • Establecer el DataSource propiedad de ellos, a exactamente la misma fuente de datos que usó para main ProductId columna, por ejemplo productBindingSource
  • Establecer ValueMember de ellos al mismo miembro de valor que configuró para la columna de identificación del producto, es la columna clave de su tabla de productos. (ProductId )
  • Establecer DisplayMember para cada uno de ellos en una columna que desee mostrar, por ejemplo, establezca uno de ellos en Nombre. uno a Precio, uno a Talla, ... . De esta manera puede mostrar campos de entidad relacionados.
  • Establecer ReadOnly propiedad de ellos a true . Hace que la celda sea de solo lectura.
  • Si desea que las columnas sean de solo lectura, configure DisplayStyle propiedad de ellos a Nothing . Elimina el estilo desplegable.

Si desea conservar ProductId editable, mantenga el DisplayStyle de ella a DropDownButton . De esta manera cuando cambias el valor de ProductId columna usando el cuadro combinado, cuando sale de la fila y pasa a la siguiente fila, verá otras celdas de la fila, muestra otras propiedades del producto seleccionado. Además, dado que las otras columnas del cuadro combinado son de solo lectura y no tienen estilo de cuadro combinado, el usuario no puede cambiar su valor y actúan solo como una columna de cuadro de texto de solo lectura que muestra otras propiedades de la entidad relacionada.

Opción 2:agregar las propiedades correspondientes a la clase parcial de entidad secundaria

Uso: Este enfoque sería útil cuando no necesite editar valores.

En este enfoque, puede definir propiedades en el valor de retorno de clase parcial de la entidad secundaria de la propiedad correspondiente de la entidad principal. Por ejemplo, para el nombre del producto, defina esta propiedad en la clase parcial del artículo de pedido:

public string ProductName
{
    get
    {
        if (this.Product != null)
            return this.Product.Name;
        else 
            return string.Empty;
    }
}

Luego, simplemente puede incluir productos al seleccionar los artículos del pedido y vincular la columna de la cuadrícula a las propiedades correspondientes del artículo del pedido.

Opción 3:dar forma a la consulta para incluir propiedades de la propiedad de navegación

Uso: Este enfoque sería útil cuando no necesite editar valores.

Puede dar forma a la consulta para incluir propiedades de propiedad de navegación. Puede usar un objeto anónimo o un modo de vista simplemente, por ejemplo:

var list = db.OrderDetails.Include("Products").Where(x=>x.OrderId==1)
             .Select(x=> new OrderDetailVM() { 
                 Id = x.Id, 
                 ProductId = x.ProductId, 
                 ProductName = x.Product.Name,     
                 Price = x.Product.Price
              }).ToList();       

Opción 4:usar el evento CellFormatting para obtener el valor de las columnas delimitadas por subpropiedades

Uso: Este enfoque sería útil cuando no necesite editar valores.

En este enfoque, puede usar CellFormatting evento de DataGridView . Simplemente puede configurar e.Value basado en el índice de la columna. Por ejemplo:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    //I Suppose you want to show product name in column at index 3
    if(e.RowIndex>=0 && e.ColumnIndex==3)
    {
        var orderLineItem= (OrderLineItem)(this.dataGridView1.Rows[e.RowIndex]
            .DataBoundItem);
        if (order!= null && orderLineItem.Product != null)
            e.Value = orderLineItem.Product.Name);
    }
}

Puede usar diferentes criterios para manejar diferentes columnas y mostrar diferentes subpropiedades.

También puede hacerlo más dinámico y reutilizable usando la reflexión. Puede extraer el valor de la subpropiedad de la propiedad de navegación mediante la reflexión. Para hacerlo, debe crear una columna y configurar DataPropertyName a subpropiedades como Product.Name luego en CellFormatting evento, utilizando la reflexión, obtenga el valor de la columna. Aquí hay un buen artículo de Antonio Bello sobre este enfoque:

  • DataGridView:cómo enlazar objetos anidados

Opción 5:mostrar la representación de cadena del objeto anulando ToString()

Uso: Este enfoque sería útil cuando no necesite editar valores.

Si desea mostrar solo una columna de la propiedad de navegación, simplemente puede anular ToString() método de la clase de propiedad de navegación y devolver el valor adecuado. De esta forma, al mostrar una propiedad de ese tipo en grilla, verás un texto amigable. Por ejemplo en clase parcial de Product , puedes escribir:

public override string ToString()
{
    return this.Name;
}

Opción 6:use un TypeDescriptor personalizado para habilitar el enlace de datos a las subpropiedades

Uso: Este enfoque sería útil cuando no necesite editar valores.

En este enfoque, puede crear un TypeDescriptor personalizado que le permita realizar enlaces de datos a propiedades de segundo nivel. Aquí hay un buen artículo de Linda Liu sobre este enfoque:

  • Cómo vincular una columna DataGridView a una propiedad de segundo nivel de una fuente de datos