2010-02-13 11 views
7

Ich habe eine Datenbank mit zwei Tabellen, Produkte und Lizenzen. Licences.ProductID hat einen Fremdschlüsselverweis auf Products.ProductID (d. H. Lizenzen für dieses Produkt).Combobox für Fremdschlüssel in DataGridView

Wie stelle ich diese Beziehung in einem WinForms DataGridView dar?

Beim Füttern der DataGridView (SQL Metal und über LINQ to SQL), die ProductLicences.ProductID, generiert es automatisch eine Spalte mit einem Textfeld erwartet ein "Produkt" (was ich natürlich nicht eingeben kann ...) .

Wie ändere ich diese Spalte, um eine Combobox zu enthalten, die die verfügbaren Produkte auflistet?


Ich habe eine Verbindung (erbt von Linq.DataContext), die Datenquelle mit dem Datagridview zugeordnet ist ein Link.IQueryable, erzeugt als solche:

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

Antwort

11

In diesem Fall ist das Verhalten, das Sie zu imitieren versuchen ist eine Lookup-Kombination. Sie möchten das Feld der Klasse License nicht verwenden, das Feld ProductID möchten Sie tatsächlich verwenden.

Hier ist ein kurzer Schritt-für-Schritt:

  1. Entfernen Sie die Product Spalte im Gitter; behalte nur die ProductID.

  2. Ändern der ProductID Spalte ColumnType Eigenschaft auf DataGridViewComboBoxColumn.

  3. Ändern Sie diese Spalte DataSource zu einem neuen BindingSource mit dem DataSource auf MyProject.Product (Sie den Assistenten nur folgen kann, wahrscheinlich die gleiche Art und Weise Sie es für das Netz hat sich, sondern mit Product statt License).

  4. Ändern Sie den Wert DisplayMember dieser Spalte in den Text, der im Kombinationsfeld angezeigt werden soll, z. B. ProductName.

  5. Ändern Sie die ValueMember in den eigentlichen Primärschlüssel, z. B. ProductID.

  6. Vor dem GridView bevöl selbst initialisieren das neue productsBindingSource mit Produktdaten, das heißt mit productBindingSource.DataSource = context.Products;.

Das ist es. Nun, wenn Sie SubmitChanges (vorausgesetzt, Sie haben die DataContext die ganze Zeit geöffnet), wird es die ProductID mit der richtigen Referenz aktualisieren. Beachten Sie, dass die Referenz für die gespeicherte Klasse möglicherweise nicht aktualisiert wird. Wenn Sie aus irgendeinem Grund die tatsächliche Entitätsreferenz verwenden müssen, müssen Sie möglicherweise zuerst die Methode DataContext.Refresh aufrufen. Aber machen Sie sich keine Sorgen, es sei denn, Sie müssen die Entity-Klasse außerhalb des Grids verwenden.

+0

Danke! Das funktioniert ganz gut. – peterchen

+0

Und was ist, wenn die Lizenzklasse nur ein Produktfeld und kein ProductID-Feld hat?(Sie sollten kein zusätzliches ProductID-Feld nur für UI-Bindungszwecke hinzufügen IMO) –

+0

@goku: Äh ... was ist, wenn der Himmel fällt? Es ist in der Frage angegeben, dass das Feld existiert, und es ist auch explizites Verhalten von Linq zu SQL (auch in der Frage angegeben). – Aaronaught

Verwandte Themen