Автозаполнение текстового поля - Winform + LINQ - PullRequest
0 голосов
/ 16 ноября 2010

Я создаю простое приложение win form с одной сеткой данных, одним TextBox. У меня около 10К записей имен.

Что я хочу сделать, так это реализовать некую функцию автозаполнения, поэтому, когда пользователь вводит текстовое поле, сетка данных обновляется для отображения соответствий соответственно.

Просто чтобы проверить это, у меня есть один объект DataContext, который возвращает таблицу имен, и я поместил некоторый код в событие textBox1_TextChanged для сброса источника данных с помощью

this.dataGrid1.DataSource = (from p in connectionWrapper.getConnectionObj.PatientsNormalizeds where p.Name.Contains(textBox1.Text) select p).Take(30);

Это работает нормально по локальному соединению, но при извлечении данных с удаленного сервера SQL это, конечно, слишком медленно, набор текста становится медленным и неприемлемым для пользователей.

Просто интересно, можно ли что-нибудь сделать без изменения дизайна. Конечно, я могу загрузить всю таблицу в список или DataTable на form_loading и запустить поиск по ней, но это приведет к тому, что форма перестанет отвечать на 3 секунды или около того ...

Это, вероятно, очень просто для большинства разработчиков, но я очень новичок.

Спасибо!

Ответы [ 4 ]

1 голос
/ 16 ноября 2010

Вы можете использовать Reactive Extensions, чтобы легко внедрить решение, которое запрашивает удаленный сервер, если пользователь очень легко набрал определенное количество символов, приостановленных на некоторое время.Следующие руки в лаборатории делают именно это: Rx .NET HOL

1 голос
/ 16 ноября 2010

На ум приходит пара подходов. Первый будет включать не фильтрацию при каждом нажатии клавиши, а поиск, когда пользователь сделал паузу, то есть они думают, что набрали достаточно, и хотят посмотреть, что это возвращает. Это можно сделать с помощью таймера, в котором задержка сбрасывается при каждом нажатии клавиши.

Использование фонового потока для выполнения запроса оставляет интерфейс отзывчивым во время получения данных.

Я бы также посмотрел на возврат минимального объекта из LINQ, то есть просто p.Name, а не всего объекта p. Это также поможет ускорить передачу данных и скорость реагирования.

0 голосов
/ 16 ноября 2010

Вы можете кэшировать данные локально в XML-файл или что-то. Приложение может не отвечать на запросы в первый раз (если вы предварительно не загружаете данные в фоновом режиме с помощью потоков), но оно будет работать очень быстро при каждом следующем запуске приложения.
Вы можете реализовать экран предварительной загрузки / заставки, чтобы уведомлять пользователей о том, что данные загружаются в фоновом режиме.

0 голосов
/ 16 ноября 2010

Вы должны запустить select в фоновом потоке aka BackgroundWorker

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...