2010-02-13 12 views
7

Tengo una base de datos que contiene dos tablas, productos y licencias. Licences.ProductID tiene una referencia de clave externa a Products.ProductID (es decir, licencias para ese producto).Combobox for Foreign Key en DataGridView

¿Cómo puedo representar esa relación en WinForms DataGridView?

Al alimentar DataGridView (SQL Metal y mediante LINQ to SQL), ProductLicences.ProductID, genera automáticamente una columna con un campo de texto que espera un "Producto" (que por supuesto no puedo ingresar ...) .

¿Cómo cambio esta columna para que contenga un cuadro combinado que enumere los productos disponibles?


tengo una conexión (hereda de Linq.DataContext), la fuente de datos asignado al DataGridView es un Link.IQueryable, generada como tal:

var ds = from c in m_connection.Licences 
    select c; 

Respuesta

11

En este caso, el comportamiento que están tratando de imitar es un Combo de búsqueda. No desea utilizar el campo Product de la clase License, en realidad desea utilizar el campo ProductID.

Aquí hay un rápido paso a paso:

  1. quitar la columna Product en la cuadrícula; mantener solo el ProductID.

  2. Cambio ColumnType la propiedad de la columna de la ProductID a DataGridViewComboBoxColumn.

  3. cambio de esta columna DataSource a un nuevo BindingSource con el DataSource establecido en MyProject.Product (que sólo puede seguir el asistente, probablemente de la misma manera que lo hizo para la propia rejilla, pero utilizando en lugar de ProductLicense).

  4. Cambie el DisplayMember de esta columna al texto que desee mostrar en el cuadro combinado, por ejemplo, ProductName.

  5. Cambie el ValueMember a la clave principal real, como ProductID.

  6. Antes de poblar el GridView sí mismo, inicializar el nuevo productsBindingSource con los datos de productos, es decir, con productBindingSource.DataSource = context.Products;.

Eso es todo. Ahora cuando SubmitChanges (asumiendo que mantuvo el DataContext abierto todo el tiempo), actualizará el ProductID con la referencia correcta. Tenga en cuenta que es posible que no actualice la referencia Product en la clase que guardó; si necesita hacer uso de la referencia de entidad real por alguna razón, es posible que deba llamar primero al método DataContext.Refresh. Pero no te preocupes por esto a menos que necesites usar la clase de entidad fuera de la grilla.

+0

Gracias! Eso funciona bastante bien. – peterchen

+0

¿Y qué sucede si la clase de licencia solo tiene un campo de Producto y no un campo IdProducto?(No debe agregar un campo ProductID adicional solo para fines vinculantes de la interfaz de usuario IMO) –

+0

@goku: Uh ... ¿y si cae el cielo? Se especifica en la pregunta que el campo existe, y también es un comportamiento explícito de Linq a SQL (también especificado en la pregunta). – Aaronaught

Cuestiones relacionadas