Eigenschaften einer Navigationseigenschaft in DataGridView anzeigen (Eigenschaften der zweiten Ebene)

Eigenschaften einer Navigationseigenschaft in DataGridView anzeigen (Eigenschaften der zweiten Ebene)

Sie können eine dieser Optionen verwenden:

  1. Verwenden Sie DataGridViewComboBoxColumn
  2. Fügen Sie der partiellen Klasse der untergeordneten Entität entsprechende Eigenschaften hinzu
  3. Formen Sie die Abfrage so, dass sie Eigenschaften der Navigationseigenschaft mit Linq enthält
  4. Verwenden Sie CellFormatting -Ereignis, um den Wert für durch Untereigenschaften begrenzte Spalten abzurufen
  5. Stringdarstellung des Objekts durch Überschreiben von ToString() anzeigen
  6. Verwenden Sie einen benutzerdefinierten TypeDescriptor um die Datenbindung an Untereigenschaften zu aktivieren.

Option 1 – DataGridViewComboBoxColumn verwenden

Verwendung: Dieser Ansatz wäre besonders in Fällen nützlich, in denen Sie das Steuerelement bearbeitbar halten möchten.

Bei diesem Ansatz können Sie DataGridViewComboBoxColumn verwenden um ein beliebiges Feld der Navigationseigenschaft anzuzeigen. Um mehrere Felduntereigenschaften der Navigationseigenschaft im Raster anzuzeigen, verwenden Sie mehrere DataGridViewComboBoxColumn an dieselbe Navigationseigenschaft mit unterschiedlichem DisplayMember gebunden

Bei diesem Ansatz zusätzlich zu Ihrem ProductId Spalte weitere DataGridViewComboBoxColumn hinzufügen zum Grid und nehmen Sie dann diese Einstellungen für alle zusätzlichen Combo-Spalten vor:

  • Setzen Sie DataPropertyName davon an ProductId
  • Stellen Sie den DataSource ein Eigentum von ihnen, zu genau der gleichen Datenquelle, die Sie für den Haupt-ProductId verwendet haben Spalte, zum Beispiel productBindingSource
  • Setzen Sie ValueMember von ihnen auf denselben Wert, den Sie für die Produkt-ID-Spalte festgelegt haben, ist dies die Schlüsselspalte Ihrer Produkttabelle. (ProductId )
  • Setzen Sie DisplayMember für jeden von ihnen zu einer Spalte, die Sie anzeigen möchten, setzen Sie beispielsweise einen von ihnen auf Name. eine nach Preis, eine nach Größe, ... . Auf diese Weise können Sie verwandte Entitätsfelder anzeigen.
  • Setzen Sie ReadOnly Eigentum von ihnen auf true . Dadurch wird die Zelle schreibgeschützt.
  • Wenn Sie Spalten schreibgeschützt machen möchten, setzen Sie DisplayStyle Eigentum von ihnen an Nothing . Es entfernt den Dropdown-Stil.

Wenn Sie ProductId behalten möchten editierbar, behalten Sie den DisplayStyle bei davon an DropDownButton . Auf diese Weise, wenn Sie den Wert von ProductId ändern Spalte mit Combobox, wenn Sie die Zeile verlassen und zur nächsten Zeile wechseln, sehen Sie andere Zellen der Zeile, zeigt andere Eigenschaften des ausgewählten Produkts. Da auch die anderen Combobox-Spalten schreibgeschützt sind und keinen Combobox-Stil haben, kann der Benutzer deren Wert nicht ändern, und sie verhalten sich nur wie eine schreibgeschützte Textfeldspalte, die andere Eigenschaften von verwandten Entitäten anzeigt.

Option 2 – Fügen Sie der Teilklasse der untergeordneten Entität entsprechende Eigenschaften hinzu

Verwendung: Dieser Ansatz wäre nützlich, wenn Sie keine Werte bearbeiten müssen.

Bei diesem Ansatz können Sie Eigenschaften im Rückgabewert der Teilklasse der untergeordneten Entität der entsprechenden Eigenschaft der übergeordneten Entität definieren. Definieren Sie diese Eigenschaft beispielsweise für den Produktnamen in der Teilklasse des Bestellartikels:

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

Dann können Sie bei der Auswahl von Bestellpositionen einfach Produkte einbeziehen und die Rasterspalte an die entsprechenden Eigenschaften der Bestellposition binden.

Option 3 – Gestalten Sie die Abfrage so, dass sie Eigenschaften der Navigationseigenschaft enthält

Verwendung: Dieser Ansatz wäre nützlich, wenn Sie keine Werte bearbeiten müssen.

Sie können die Abfrage so gestalten, dass sie Eigenschaften der Navigationseigenschaft enthält. Sie können einfach ein anonymes Objekt oder einen Ansichtsmodus verwenden, zum Beispiel:

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();       

Option 4 – Verwenden Sie das CellFormatting-Ereignis, um den Wert für begrenzte Spalten mit untergeordneten Eigenschaften abzurufen

Verwendung: Dieser Ansatz wäre nützlich, wenn Sie keine Werte bearbeiten müssen.

Bei diesem Ansatz können Sie CellFormatting verwenden Ereignis von DataGridView . Sie können einfach e.Value einstellen basierend auf dem Spaltenindex. Zum Beispiel:

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);
    }
}

Sie können unterschiedliche Kriterien verwenden, um unterschiedliche Spalten zu behandeln und unterschiedliche Untereigenschaften anzuzeigen.

Sie können es auch dynamischer und wiederverwendbarer machen, indem Sie Reflektion verwenden. Sie können den Wert der Untereigenschaft der Navigationseigenschaft mithilfe von Reflektion extrahieren. Dazu sollten Sie Spalte erstellen und DataPropertyName setzen zu untergeordneten Eigenschaften wie Product.Name dann in CellFormatting Ereignis, mithilfe von Reflektion, den Wert für die Spalte abrufen. Hier ist ein guter Artikel von Antonio Bello über diesen Ansatz:

  • DataGridView:Wie man verschachtelte Objekte bindet

Option 5 – Stringdarstellung des Objekts anzeigen, indem ToString() überschrieben wird

Verwendung: Dieser Ansatz wäre nützlich, wenn Sie keine Werte bearbeiten müssen.

Wenn Sie nur eine einzelne Spalte der Navigationseigenschaft anzeigen möchten, können Sie ToString() einfach überschreiben Methode der Navigationseigenschaftsklasse und geben Sie einen geeigneten Wert zurück. Auf diese Weise sehen Sie beim Anzeigen einer Eigenschaft dieses Typs im Raster einen freundlichen Text. Zum Beispiel in Teilklasse von Product , können Sie schreiben:

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

Option 6 – Verwenden Sie einen benutzerdefinierten TypeDescriptor, um die Datenbindung an Untereigenschaften zu aktivieren

Verwendung: Dieser Ansatz wäre nützlich, wenn Sie keine Werte bearbeiten müssen.

Bei diesem Ansatz können Sie einen benutzerdefinierten TypeDescriptor erstellen, mit dem Sie eine Datenbindung an Eigenschaften der zweiten Ebene durchführen können. Hier ist ein guter Artikel von Linda Liu über diesen Ansatz:

  • So binden Sie eine DataGridView-Spalte an eine Eigenschaft der zweiten Ebene einer Datenquelle