Я очень удивлен, увидев, что ни элемент управления текстовым полем, ни коллекция автозаполненных строк не могут указать, что определяет равенство строк для механизма автозаполнения.Единственный способ получить желаемое поведение - это создать свой собственный механизм автозаполнения.
В прошлом я делал это несколько раз, до того как функциональность была предоставлена фреймворком,и это не сложно.
Просто используйте редактируемый ComboBox вместо TextBox и обработайте событие TextChanged для создания автозаполнения.
Вот некоторый неопробованный псевдокод процедуры:
bool textChangedProgramatically = false;
List<string> myStrings; // The list of items that can appear in the auto-complete.
private static myComboBox_TextChanged(object sender, EventArgs args)
{
if (textChangedProgramatically)
return;
string searchText = myComboBox.Text;
// Use appropriate culturally-sensative string StartsWith comparisons
List<string> matchingItems = GetMatchingStrings(searchText, myStrings);
string firstMatch;
if (matchingItems.Length > 0)
firstMatch = matchingItems[0];
else
firstMatch = string.Empty;
myComboBox.Items.Clear;
myComboBox.Items.AddRange(matchingItems);
string fulltext = searchText;
if (firstMatch.Length > fullText.Length)
{
fullText = fullText + firstMatch.Substring(fullText.Length);
textChangeProgramatically = true;
myComboBox.Text = fullText;
myComboBox.SelectionStart = searchText.Length;
myComboBox.SelectionLength = fullText.Length - searchText.Length;
textChangeProgramatically = false;
}
}
Хитрость заключается в том, чтобы получить правильное поведение соответствия в GetMatchingStrings.Возможно, вы захотите использовать нормализацию совместимости строк для перевода арабских символов в непрезентационные формы перед выполнением сравнения, но я ожидаю, что правильная перегрузка SubString может обработать все эти случаи для вас.