2009-10-22 36 views
6

Tôi nghĩ đây là một vấn đề đơn giản, nhưng tôi không thể tìm thấy bất kỳ thông tin nào trên web. Tôi đang ràng buộc một ListBox để một List sử dụng BindingSource như vậy:ListBox không hiển thị các thay đổi đối với DataSource

List<Customer> customers = MyMethodReturningList(); 

BindingSource customersBindingSource = new BindingSource(); 
customersBindingSource.DataSource = customers; 

customersListBox.DataSource = customersBindingSource; 

Bây giờ, khi tôi thêm hoặc xóa khỏi danh sách customers, tôi ListBox được cập nhật (ngay cả khi không sử dụng ResetBindings trên BindingSource), nhưng nếu tôi thay đổi bất kỳ của các đối tượng khách hàng trong danh sách, nó không. Gọi ResetBindings không có hiệu lực. Tôi thậm chí còn triển khai BindingList của riêng mình, nhưng hành vi đó đã không thay đổi.
Lớp Customer sử dụng các thuộc tính để truy cập và sửa đổi dữ liệu. Nội dung ToString() của nó được hiển thị trong danh sách.

Tôi đang sử dụng C# trong .Net 2.0.

Bất kỳ ý tưởng nào?

Cảm ơn

Trả lời

4

OK, đây là một sửa chữa bẩn: wenever bạn cần phải làm mới nội dung hộp set datasource = null, sau đó rebind nó.

lý do nó không cập nhật là do các đối tượng trong danh sách không thay đổi và nó chỉ kiểm tra độ chính xác của đối tượng chứ không phải nội dung của chúng.

+0

Vâng, tôi nghĩ rằng đó là những gì tôi đã làm cuối cùng (tôi đã không có mã ngay bây giờ), nhưng như bạn đã nói, nó bẩn. –

+0

Một vấn đề khác là, nguồn dữ liệu mất cài đặt thời gian thiết kế của nó, ví dụ: Các thuộc tính DisplayMember và ValueMember bị bỏ đặt. – Softec

2

Ngoài ra còn có một lỗi trong hộp danh sách có thể gây ra sự cố này. Nếu bạn đặt SelectionMode thành None vấn đề này sẽ xuất hiện.

Là một công việc xung quanh tôi đặt chế độ chọn thành Một và sau đó quay lại Không khi cập nhật nguồn dữ liệu.

5

Nếu bạn sử dụng một BindingList bạn thậm chí không cần BindingSource:

BindingList<Customer> customers = new BindingList<Customer>(MyMethodReturningList()); 
customersListBox.DataSource = customers; 
0

tôi xung quanh vấn đề này bằng cách chuyển đổi dữ liệu vào mảng khi cập nhật nguồn. Vui lòng xem phương thức UpdateData. Bằng cách này bạn có thể cập nhật hộp kết hợp của bạn mà không mất Cài đặt ComboBox.

class Person { 
    public int Id {get; set; } 
    public string FirstName{ get; set; } 
    public string SurName {get; set; } 
} 

public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.DisplayMember = "FirstName"; 
    comboBox1.ValueMember = "Id"; 
    comboBox1.DataSource = m_PersonList; 
} 

public void UpdateData() { 
    m_PersonList[0].FirstName = "Firstname1"; 
    comboBox1.DataSource = m_PersonList.ToArray<Person>(); 
} 
0

Tôi hiểu rằng câu hỏi này được hỏi gần 6 năm trước nhưng khác với công việc xung quanh tôi không thấy câu trả lời đúng ở đây. Khi bạn thay đổi thuộc tính của một mục trong bộ sưu tập, sự kiện sẽ được nâng lên cho phần tử (đối tượng) chứ không phải bộ sưu tập. Vì vậy, bộ sưu tập không thấy thay đổi và sẽ không làm mới các điều khiển bị ràng buộc. Các yếu tố bên trong tất cả các bộ sưu tập ràng buộc và hầu hết các bộ sưu tập chung chung như List<> đều nhận được 2 sự kiện, PropertyChangingPropertyChanged. Khi một thuộc tính của phần tử bên trong bộ sưu tập được thay đổi, sự kiện sẽ được kích hoạt. Tất cả những gì bạn cần làm là thêm một trình xử lý sự kiện kích hoạt hoặc ràng buộc lại hoặc tăng sự kiện trên Collection.

Các vấn đề liên quan