2013-02-19 20 views
6

Tôi có vẻ là sự hiểu lầm về phương thức ListBox.Refresh() và tôi hy vọng ai đó có thể giúp tôi.ListBox đã đặt nguồn dữ liệu nhưng Làm mới không có gì

Điều tôi đang cố gắng làm:
Tôi muốn tải dữ liệu của hộp danh sách (nguồn = bảng của cơ sở dữ liệu sql) khi khởi tạo biểu mẫu cửa sổ. Ngoài ra khi người dùng thêm dữ liệu vào cơ sở dữ liệu, tôi muốn hộp danh sách cập nhật.

Logic:
Tôi có một cơ sở dữ liệu sql như nguồn của tôi, nó được thiết lập như:

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

DBquery.informationRetreval() là một phương pháp tĩnh trong lớp tĩnh DBQuery tôi. Tất cả những gì nó làm là thiết lập một bảng từ cơ sở dữ liệu và sau đó trả về bảng.

tôi đặt nguồn dữ liệu trong cùng một phương pháp như InitializeComponent (để listbox của tôi sẽ được tải với các dữ liệu hiện có):

public Settings() 
    { 
     InitializeComponent(); 
     listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 
    } 

Khi người dùng thêm nhiều dữ liệu hơn: Tôi gọi một phương thức trong đó tôi thêm dữ liệu vào cơ sở dữ liệu và sau đó tôi gọi:

listBoxDays.Refresh(); //update listbox 

Vấn đề: Điều này không cập nhật hộp danh sách. Khi khởi tạo hộp danh sách của tôi, dữ liệu sẽ cư trú nhưng sau khi nó sẽ không thay đổi (do đó làm mới không hoạt động). Tại sao vậy? Tôi có thể thiết lập DataSource một lần nữa nhưng điều đó cảm thấy cẩu thả. Sau khi xem xét một số tài liệu tôi nhận thấy trình xử lý sự kiện DataSourceChanged có thể nhiều hơn cho những gì tôi đang tìm kiếm. Tuy nhiên tại sao không làm mới?

Cảm ơn sự kiên nhẫn của bạn. Vui lòng cho tôi biết nếu tôi cần rõ ràng hơn.

Trả lời

9

Làm mới(): Buộc kiểm soát làm mất hiệu lực vùng khách hàng và ngay lập tức vẽ lại chính nó và bất kỳ điều khiển con nào.

Làm mới sẽ không phục hồi lại quyền kiểm soát của bạn, điều này sẽ khiến cho điều khiển được vẽ lại. Bạn sẽ phải đặt lại số DataSource bằng

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

và liên kết lại.

Nguồn: (. Ex một truy vấn khác nhau) Microsoft MSDN

+0

Có ý nghĩa hơn khi sử dụng trình xử lý sự kiện: ListControl.DataSourceChanged ... xảy ra khi nguồn dữ liệu thay đổi không? – 40Alpha

+0

Tôi sẽ nói để tạo một phương thức sẽ làm sạch và liên kết điều khiển và gọi nó từ InitializeComponent() và từ mọi nơi khác bạn đang sử dụng hàm .Refresh(). –

+1

Ngoài ra, ít nhất là trong phiên bản VB tôi đang làm việc với tôi có một lỗi nói rằng bạn không thể xóa các mục khi dữ liệu bị ràng buộc vào một nguồn dữ liệu. Tất cả những gì tôi phải thêm vào là thêm một dòng mà 'Listbox.DataSource = Nothing' đã nói và sau đó xóa các mục của tôi và rebind dữ liệu của tôi – PsychoData

15

Nó sẽ chỉ làm mới khi đối tượng đã thay đổi, không phải là dữ liệu. Bạn có thể làm điều này:

listBoxDays.DataSource = null; 
listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

để làm mới ... mọi lúc bạn cần.

+2

tuyệt vời! tôi không lý do tại sao chúng tôi phải làm điều này – rajeemcariazo

+0

Điều này: "nó sẽ chỉ làm mới khi các đối tượng đã thay đổi (ví dụ một truy vấn khác), không phải là dữ liệu" bị thiếu trong nhiều câu trả lời khác liên quan đến câu hỏi/vấn đề này – Pavenhimself

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