2011-01-23 10 views
5

Cố gắng thêm bản ghi mới vào EntityCollection lúc chạy và có bản cập nhật DataGridView với thông tin mới.Làm thế nào để có được một Windows Forms DataGridView để hiển thị hồ sơ mới khi bị ràng buộc để EntityCollection

Tôi đã cố gắng liên kết trực tiếp datagridview với bộ sưu tập thực thể (ví dụ: ObjectSet) và thông qua BindingSource được liên kết với cùng một bộ sưu tập.

Tôi đã thử DataGridView.Refresh(), DataGridView.EndEdit() và BindSource.ResetBindings() trong số những thứ khác, nhưng không có gì có vẻ hoạt động.

Trả lời

0

Hãy thử rằng:

bindingSource.DataSource = null; 
bindingSource.DataSource = theCollection; 

Ngoài ra, bạn có thể duy trì một trong bộ nhớ bản sao của dữ liệu trong một BindingList<T>. Liên kết DataGridView với BindingList và khi bạn thêm một thực thể vào số ObjectSet, hãy thêm nó vào số BindingList.

+0

còn gọi là cách ghetto, :). Đã hy vọng cho một phương pháp ít bạo lực. Điều này không làm việc mặc dù nguyên nhân tôi hiện đang bị ràng buộc vào một BindingSource. Kết quả nào trong lưới sẽ bị xóa. – Jaime

+0

Thực thể không hoạt động tốt với DataGridView? Vì vậy, tôi cần phải giữ 2 bộ sưu tập của cùng một dữ liệu để có được điều này để làm việc? – Jaime

+0

@Jaime, bạn cần nhận ra rằng một ObjectSet không thực sự là một bộ sưu tập, nó thực sự là một truy vấn *. Nó không giữ các thực thể trong bộ nhớ (mặc dù ObjectContext giữ một bộ nhớ cache của các thực thể đã được nạp) –

0

Tôi đang mắc kẹt với cùng một vấn đề. Microsoft nên quan tâm đến những người sử dụng công nghệ của họ và EF nên quan tâm đến việc ràng buộc dữ liệu. Jaime, nếu bạn tìm được cách tốt hơn, hãy cập nhật danh sách này. Đối với tôi, việc tạo lại cá thể ngữ cảnh hoạt động tốt cho tôi. Điều thú vị là trình gỡ lỗi cho thấy bối cảnh thực thể & nguồn ràng buộc có các cập nhật mới nhất nhưng datagridview vẫn không làm mới. Cảm ơn

Here sự là giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay -

Về cơ bản bạn cần làm

bindingSource.DataSource = EntityContext.Collection 
           .Execute(MergeOption.AppendOnly); 
0

Tôi hy vọng nó không phải là quá muộn =) Tôi có một cái gì đó mà làm việc ở đây ...

// Entity Data Model 
private ManagerEntities context = new ManagerEntities(); 

// declare private member  
private BindingList<Currency> lstCurrencies = null; 

// on form load, load data and bind to DataGridView's DataSource 

private void Form1_Load(object sender, EventArgs e) { 

    lstCurrencies = new BindingList<Currency>(); 

    ObjectResult or = ((ObjectQuery)currencies).Execute(MergeOption.AppendOnly); 
    foreach (Currency c in or) 
     lstCurrencies.Add(c); 

    // dgMain is my DataGridView 
    dgMain.DataSource = lstCurrencies; 
} 

// this will save objects that have changed. You might want to add logic for newly created and deleted objects. 
private void btnSave_Click(object sender, EventArgs e) { 
    context.SaveChanges(); 
}