Автоматическое разрешение текстового поля для .NET Windows Forms - PullRequest
1 голос
/ 27 мая 2009

Мне нужно создать текстовое поле, которое будет автоматически разрешать то, что пользователь вводит на основе списка значений, что-то похожее на поле «Кому» в почтовых клиентах.

Например, мой список имеет следующие значения:

Автомобиль жилой дом Дерево

Если вы наберете «hou», это автоматически разрешит «Дом», а попытка удалить одну букву (с пробелом или удалением) этого слова полностью удалит его, а также не позволит связываться с уже разрешенным словом например "Hou [что-то] SE").

Конечно, я мог бы создать это, используя обычное текстовое поле и контролируя, что набрано, и сохраняя структуру с разрешенными словами ..... хотя есть много исключений, с которыми приходится иметь дело, и я не желаю заново изобрести колесо. Кто-нибудь реализовывал что-то подобное раньше? Есть ли какой-нибудь элемент управления в visual studio, обеспечивающий что-то похожее на то, что я описал?

Обновление

Обратите внимание, что я понимаю, что обычное текстовое поле поддерживает автозаполнение, но помимо автозаполнения мне нужно авторазрешение, которое является другой концепцией ...

Ответы [ 2 ]

2 голосов
/ 27 мая 2009

Стандартный TextBox элемент управления уже поддерживает это через AutoCompleteSource, AutoCompleteMode и AutoCompleteCustomSource свойства.

Вы можете выбрать стандартный полный источник с помощью AutoCompleteSource или указать собственный список, а затем предоставить объект AutoCompleteStringCollection для AutoCompleteCustomSource собственность. Хотя я не пробовал, я подозреваю, что это не так гибко, как вариант Win32, где вы можете динамически предоставлять результаты автозаполнения на основе того, что было напечатано до сих пор, но вы можете подражать этому переопределение AutoCompleteStringCollection.

Обновление

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

0 голосов
/ 30 июля 2011

Я бы создал usercontrol, содержащий flowlayout-control. Элемент управления потоком данных автоматически изменит размер до размера пользовательских элементов управления.

При запуске управление потоком будет содержать одно текстовое поле без каких-либо видимых границ. Пользователь вводит текст, и для каждого нажатия клавиши вы пытаетесь разрешить слово. Если оно разрешается как слово, то добавьте метку перед текстовым полем, метка будет иметь разрешенное слово как текст, а его шрифт будет подчеркнут. И текстовое поле теперь очищено для новой записи. Если пользователь нажимает клавишу «Backspace» или «Влево» в пустом текстовом поле, выберите предыдущий элемент управления в Flowlayout и сделайте шрифт этого ярлыка полужирным и подождите (удалить, чтобы удалить слово или стрелку влево и вправо для перехода к другому слову или пустому текстовому полю). Стоя на разрешенном слове: если нажать влево, переместите текстовое поле так, чтобы оно было слева от разрешенного слова. При нажатии вправо переместите текстовое поле справа от разрешенного слова. Двойной щелчок по метке удаляет метку и активирует текстовое поле с текстом, готовым для редактирования.

Работая с метками (= разрешенные слова) и текстовым полем для ввода новых слов, довольно легко эмулировать поле To в email-программах. Единственное, что является «сложным», - это позволить пользователю выбрать несколько слов и удалить их, но есть много решений (google + flowlayoutcontrol + множественный + выбор). Кроме того, можно также выполнить автозаполнение в текстовом поле, чтобы «разрешить» известный список слов.

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

Edit: Не нашел программу, поэтому я потратил 30 минут, переписывая ее с нуля, используя (flowlayoutcontrol, label, textbox) в качестве пользовательского контроля enter image description here

Фильм об этом в прямом эфире: http://www.youtube.com/watch?v=1MJ7bmFcCmE

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

Вот исходный код для этого примера: http://www.filefactory.com/file/cda1d84/n/testproj.zip

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