2017-06-26 6 views
0

2つのクラスがあり、多くの企業と製品との関係があります。したがって、商品を表示するときには会社に商品名を表示するので、直接結ぶ方法はありません。DataGridvView複雑なクラスオブジェクトをwinformsのdatagridviewにバインドする

public class Product : Common 
{ 
    public Int32 ProductID { get; set; } 

    [MaxLength(100)] 
    public string ProductName { get; set; } 

    public virtual ProductType ProductOfType { get; set; } 

    public virtual Company ProductCompany { get; set; } 

    public virtual PackageType ProductPackageType { get; set; } 
} 

DGProduct.DataSource = db.Product.toList()、行ように、我々はその後、DataGridvViewを結合し、そのショーMedicineEntity.ProductCompanyので、直接結合またはループを使用して手動でバインドする必要があるためにどのような方法があります。任意のオプションがあれば提案してください。そうでなければ、ループを使用してDataGridvViewをバインドするか、リストをデータテーブルに変換する必要があります。

+0

[方法:WindowsにバインドオブジェクトがDataGridViewのコントロールをフォーム](https://でdocs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-bind-objects-to-windows-forms-datagridview-controls) – Luke

答えて

1

最も簡単な方法は、CompanyクラスにToStringメソッドを定義することです。

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

その他の方法には、手動でDataGridView

一つのアプローチで列を指定する必要がカスタムTypeDescriptionProviderを書いてTypeDescriptionProviderAttributeCompanyクラスを飾る必要とします。完全なコードについては、この資料を使用してください:How to bind a DataGridView column to a second-level property of a data source

[TypeDescriptionProvider(typeof(CompanyDescriptionProvider))] 
class Company 
{ 
    // ... 
} 
class CompanyDescriptionProvider : TypeDescriptionProvider 
{ 
    // implementation 
} 

もう一つは、BoundFieldを定義し、あなたのグリッドにそれを追加することです:

public class CompanyField : BoundField 
{ 
    protected override string FormatDataValue(object dataValue, bool encode) 
    { 
     var obj = dataValue as Company; 

     if (obj != null) 
     { 
      return obj.Name; 
     } 
     else 
     { 
      return base.FormatDataValue(dataValue, encode); 
     } 
    } 
} 
関連する問題