2010-02-01 30 views
5

Tôi đang làm việc trong C# với hộp văn bản hoạt động như đầu vào cho tra cứu bản ghi cơ sở dữ liệu (Access SQL) theo số id. Tôi muốn có thể sử dụng AutoComplete trên hộp văn bản nhưng với một số hạn chế.C# Textbox AutoComplete: Giới hạn ~ 50 đề xuất

Vấn đề lớn là số lượng id trong hệ thống là theo thứ tự hàng nghìn vì vậy thay vì điền vào hộp Tự động hoàn tất một lần với tất cả, tôi cần theo dõi nội dung trong hộp văn bản và chỉ hiển thị đề xuất tự động điền khi có ~ 50 hoặc ít hơn lựa chọn.

Hiện nay, tôi đang làm truy vấn này trên mỗi KeyDown: SELECT count (*) FROM table WHERE id LIKE 'TextBox.Text%'

Khi đếm ít hơn 50 Tôi lấp đầy autocomplete với kết quả từ một phiên bản SELECT id của câu lệnh trên. Điều này đã dẫn tôi đến một số vấn đề, hầu hết dường như là C# quirks tôi không hiểu.

1) Khi tôi xóa hoặc thêm vào AutoCompleteCustomSet trong một sự kiện KeyDown duy nhất, phím thực tế được nhấn không được thêm vào chuỗi (tức là hành vi nhập hộp văn bản thông thường không xảy ra).

2) Tôi đã thử tách bản cập nhật AutoCompleteCustomeSet thành sự kiện khác (KeyPress hoặc KeyUp) nhưng điều này dẫn đến sự cố hoặc màn hình tự động hoàn thành sẽ hiển thị nhanh trước khi bị ẩn.

Tôi cảm thấy vấn đề này phải rất phổ biến và tôi đang đi đúng hướng. Có ai có lời khuyên nào không? Cảm ơn!

EDIT: đây là Windows Forms

EDIT2: Một top 50 chọn không sửa chữa các vấn đề mà khi người dùng (và có khả năng backspaces và tái loại) top 50 sẽ thay đổi.

+1

Đây có phải là WinForms không? WPF? ASP.NET? – LBushkin

Trả lời

1

Bạn hãy thử các sự kiện TextChanged để thay thế? Tôi hy vọng rằng sự kiện sẽ được kích hoạt SAU KHI hộp văn bản đã được cập nhật, do đó tránh được các quirks mà bạn đề cập đến.

+0

Cảm ơn, điều này đã làm việc. Một phần của vấn đề của tôi cũng được gọi là Clear() trên AutoCompleteCustomSet trên mỗi phím bấm là tốt. Rõ ràng điều này là không thực sự cần thiết, và làm nó có tác dụng phụ tiêu cực. – Rich

0

Bạn không thể chỉ CHỌN TOP 50 TỪ KHI ĐÂU ...?

0

Chỉ giới hạn đề xuất của bạn cho 50 đề xuất phù hợp với bạn? Khi lựa chọn của bạn gợi ý của bạn, bạn có thể sử dụng một truy vấn như thế này:

CHỌN TOP 50 * TỪ YourTable ĐÂU .....

0

Lý do bạn nhận tai nạn có thể là bạn get a race condition khi thay thế nguồn autocomplete, được sử dụng bởi một sợi nền để tính toán các ứng cử viên trong khi bạn đang gõ (hoặc bạn đặt rỗng thay vì String.Empty trong danh sách ứng cử viên)

Trước Windows Vista, đối tượng Tự động hoàn thành match candidates with prefix only, do đó, không điền các chuỗi ứng cử viên không bắt đầu bằng chuỗi đã nhập.

Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list.

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