2014-09-04 3 views
1

Я 3 лица закодированы в моем приложении: счета, продукта, ПокупкаВыпуск

Объект Покупка имеет счет и продукт, затем несколько других стандартных типов данных (доход, дата, количество и т.д.)

[System.Data.Linq.Mapping.Table(Name = "Purchases")] 
public class Purchase 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long PurchaseId { get; set; } 

    public Account Account { get; set; } 

    public Product Product { get; set; } 

    public DateTime PurchaseDate { get; set; } 

    public decimal Revenue { get; set; } 

    public long Quantity { get; set; } 
} 

объект счета имеет ObservableCollection, и я предполагал доступ покупки и привязки к элементам управления, как это:

Account acct = db.Accounts.First(a => a.AccountId == 1); 

this.dataGridView1.DataSource = acct.Purchases.ToBindingList(); 

Единственная проблема заключается в том, что столбец DataGrid для учетной записи и продукта не заполняется, как ожидалось. Я получаю странную версию прокси-сервера, а Продукт пуст. Смотрите ниже:

DataGridPng

1) Что мне нужно сделать так, чтобы столбец счета заполняется ACCOUNTID и колонок продукта получает ProductId (Или еще лучше другое свойство, как ProductName)?

2) Кажется, что прямое связывание объектов EF с элементами управления с использованием .ToBindingList() (показано здесь http://msdn.microsoft.com/en-us/data/jj682076.aspx) крайне ограничено. Например, можете ли вы связать определенные столбцы и исключить других? Как насчет этого сценария, когда вы используете объект, который объединяет другие объекты? Большинство примеров привязки данных, которые я видел, довольно простые, и я не уверен, что этот подход будет соответствовать моим требованиям. Есть ли у вас какие-либо советы/ресурсы для комплексного связывания?

ответ

1

Вы можете переопределить метод ToString на связанном объекте, может быть в частичном классе или в основном классе.

public partial class Product 
{ 
    public override string ToString() 
    { 
     return ProductName; 
    } 
} 

Или вы можете также использовать Select, чтобы выбрать, какие колонки для отображения.

var purchases = acct.Purchases.Select(p => new 
{ 
    p.PurchaseId, 
    Account = p.Account.AccountName, 
    Product = p.Product.ProductName, 
    p.PurchaseDate 
}); 
var source = new ObservableCollection<object>(purchases).ToBindingList(); 
this.dataGridView1.DataSource = source; 
+1

В итоге я нашел пример такого подхода, и он работает очень хорошо. Я новичок в платформе, и в учебнике не упоминается этот вариант. Вероятно, потому что анонимный тип не может быть записан. Однако для моих нужд это было прекрасно. – wesmantooth