2010-02-13 16 views
7

Ho un database contenente due tabelle, Prodotti e Licenze. Licences.ProductID ha un riferimento a chiave esterna a Products.ProductID (ovvero licenze per quel prodotto).Casella combinata per chiave esterna in DataGridView

Come si rappresenta tale relazione in un DataGridView di WinForms?

Quando si alimenta il DataGridView (SQL Metal e tramite LINQ su SQL), ProductLicences.ProductID, genera automaticamente una colonna con un campo di testo che si aspetta un "Prodotto" (che ovviamente non posso immettere ...) .

Come modificare questa colonna per contenere una casella combinata che elenca i prodotti disponibili?


Ho un collegamento (eredita da Linq.DataContext), l'origine dati assegnata al DataGridView è un Link.IQueryable, generato come tale:

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

risposta

11

In questo caso, il comportamento che stanno cercando di imitare è una combo di ricerca. Non si desidera utilizzare il campo Product della classe License, in realtà si desidera utilizzare il campo ProductID.

Ecco un breve passo-passo:

  1. rimuovere la colonna Product nella griglia; mantieni solo il ProductID.

  2. Modifica ColumnType proprietà della colonna ProductID per DataGridViewComboBoxColumn.

  3. Cambio di questa colonna DataSource ad una nuova BindingSource con il DataSource impostato MyProject.Product (si può solo seguire la procedura guidata, probabilmente lo stesso modo in cui l'avete fatto per la griglia in sé, ma utilizzando Product invece di License).

  4. Modificare lo DisplayMember di questa colonna in qualsiasi testo che si desidera visualizzare nella casella combinata, ad esempio ProductName.

  5. Modificare ValueMember nella chiave primaria effettiva, ad esempio ProductID.

  6. Prima popolare il GridView stessa, inizializzare il nuovo productsBindingSource con dati di prodotto, cioè con productBindingSource.DataSource = context.Products;.

Questo è tutto. Ora, quando si(supponendo che si sia tenuto aperto il tempo di esecuzione del periodo DataContext), si aggiornerà lo ProductID con il riferimento corretto. Si noti che potrebbe non aggiornare il riferimento Product sulla classe che ha salvato; se è necessario utilizzare il riferimento entità reale per qualsiasi motivo, potrebbe essere necessario chiamare prima il metodo DataContext.Refresh. Ma non preoccuparti di questo a meno che tu non debba usare la classe di entità fuori dalla griglia.

+0

Grazie! Funziona abbastanza bene. – peterchen

+0

E se la classe Licenza ha solo un campo Prodotto e non un campo ProductID?(Non dovresti aggiungere un campo ProductID in più solo per scopi di associazione UI) –

+0

@goku: Uh ... e se il cielo cade? È specificato nella domanda che il campo esiste ed è anche il comportamento esplicito di Linq in SQL (specificato anche nella domanda). – Aaronaught

Problemi correlati