2012-12-26 34 views
6

Tôi có một biểu mẫu Windows, có chứa một hộp văn bản và một datagridview. Ngay sau khi văn bản của hộp văn bản được thay đổi, nguồn dữ liệu của datagridview được cập nhật. Nó được thực hiện bằng cách xử lý sự kiện TextChanged của hộp văn bản và gán nguồn dữ liệu cho một Danh sách mới chẳng hạn. Thông thường, nguồn dữ liệu mới chứa hơn 1000 hàng, lượng dữ liệu khá lớn. Ngoài ra, truy vấn DB để lấy danh sách này cũng tốn thời gian.The Magic Of DataGridView

Điều làm tôi ngạc nhiên là nếu tôi nhập đủ nhanh vào hộp văn bản, việc tạm ngưng dữ liệu tự động hiển thị lặp đi lặp lại và nó chỉ hiển thị kết quả cuối cùng. Nó hoàn toàn bỏ qua các kết quả trung bình. Điều này có ý nghĩa bởi vì chuỗi giao diện người dùng đang chạy bận trong các thay đổi văn bản liên tiếp. Nhưng tại sao tôi vẫn có thể nhập vào hộp văn bản?

  1. TextChange
  2. Fetching Data
  3. Refreshing DataGridView (không render/sơn)
  4. TextChange
  5. Fetching Data
  6. Refreshing DataGridView (không render/sơn)
  7. ... TextChange
  8. Tìm nạp dữ liệu
  9. Làm mới DataGridView (vẽ/vẽ hoàn thiện)
  10. Xong.

Nó giống như hộp văn bản nằm trên một chủ đề khác nhưng hoàn toàn không. Có ai biết tại sao không?

Trả lời

6

Điều này không dành riêng cho DataGridView, bất kỳ cửa sổ Windows nào cũng tự động có khả năng này. Nó được cung cấp bởi hàng đợi tin nhắn , cấu trúc dữ liệu được liên kết với chuỗi hiển thị cửa sổ. Khi luồng đang bận làm điều gì đó khác, Windows sẽ thêm một thông báo vào hàng đợi trên một sự kiện đầu vào như một nút bấm chuột hoặc một phím bấm bàn phím.

Sau khi chuỗi kết thúc những gì nó đang làm, nó lại nhập vào vòng lặp tin nhắn (một trong những bắt đầu bởi Application.Run()), lấy thông điệp từ hàng đợi và xử lý nó. Lần lượt nào gây ra sự kiện TextChange để kích hoạt. Vì vậy, cách tốt để hình dung hàng đợi là bộ đệm . Nó có thể lưu trữ lên đến 10.000 sự kiện theo mặc định.

+0

Đó là sự thật. Nhưng tại sao hộp văn bản thực sự xử lý thông điệp đầu vào (thông báo nhấn phím) nhưng dgv không tự hiển thị sau mỗi lần nhấn phím? – Alireza

+1

Tin nhắn sơn là thông điệp ưu tiên thấp, chỉ được gửi khi hàng đợi trống. –

+0

Cảm ơn bạn Hans. Tôi muốn biết thêm về chuỗi giao diện người dùng, vòng lặp tin nhắn và mức độ ưu tiên của tin nhắn. Bạn vui lòng đặt tên cho một tài liệu tham khảo tốt? – Alireza