Не работает AutoCompleteCustomSource с данными имен пользователей

#c# #winforms #autocomplete #textbox

#c# #winforms #автозаполнение #текстовое поле

Вопрос:

Я пытаюсь создать текстовое поле с автоматическим завершением.
В конструкторе моей формы я получаю данные из базы данных и устанавливаю свойство TextBox AutoCompleteCustomSource в массив имен пользователей.
По какой-то причине функция автозаполнения не работает.

Я уверен, что с db.getUsersList() методом проблем нет (скриншот внизу).

 public mainPanel()
{
    InitializeComponent();
    AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
    collection.AddRange(db.getUserList().ToArray());
    nickName.AutoCompleteCustomSource = collection;
}
  

введите описание изображения здесь

Комментарии:

1. Вы также установили nickName.AutoCompleteSource = AutoCompleteSource.CustomSource; и nickName.AutoCompleteMode = AutoCompleteMode.SuggestAppend; (или AutoCompleteMode.Suggest )? Кстати, вы можете просто: nickName.AutoCompleteCustomSource.AddRange(db.getUserList().ToArray()) . AutoCompleteCustomSource уже является AutoCompleteStringCollection: вам не нужен другой, чтобы установить его, вы можете сделать это напрямую..

2. Что это значит разные типы ? Вы должны указать AutoCompleteSource . Что это?. Из того, что вы здесь показываете, это пользовательский источник.

3. Извините, я случайно это сделал — nickName.AutoCompleteSource = nickName.AutoCompleteCustomSource; :DD

4. Можете ли вы отправить его в качестве ответа, я настрою его на ответ

Ответ №1:

Чтобы настроить элемент управления, поддерживающий автоматическое завершение, необходимо указать источник функции автозаполнения. При установке в коллекцию строк с помощью свойства AutoCompleteCustomSource, для свойства AutoCompleteSource должно быть установлено значение AutoCompleteSource.CustomSource и AutoCompleteMode имеют значение AutoCompleteMode.SuggestAppend или AutoCompleteMode.Suggest .

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

Поскольку кажется, что код в вопросе использует какой-то источник данных для создания AutoCompleteCustomSource коллекции, вот общий пример, который создает CustomSource из List<class> , добавляет привязки к элементам управления с помощью Binding класса и обновляет значения некоторых элементов управления с помощью BindingSource .

В примере, как видно из визуального примера, используются три элемента управления: текстовое поле ( txtAutoComp ), в котором включена функция автозаполнения, и две метки ( lblNickName и lblNickValue ), привязанные к одному и тому же источнику данных, которые обновляются при изменении текста элемента управления автозаполнением.
Автозаполнение расширено, чтобы позволить находить элементы, используя частичные строки, либо нажав кнопку ( btnFindNick , здесь), либо нажав Enter клавишу в текстовом поле:

Текстовое поле AutoCompleteCustomSource

 private class NickName
{
    public string Nick { get; set; }
    public int Value { get; set; }
}

private BindingSource source = null;
private List<NickName> NickNames = null;

private void Form1_Load(object sender, EventArgs e)
{
    NickNames = new List<NickName>();
    NickNames.AddRange(new[] {
        new NickName() { Nick = "", Value = 0 },
        new NickName() { Nick = "Andrea", Value = 10 },
        new NickName() { Nick = "Arnold", Value = 20 },
        new NickName() { Nick = "Barbara", Value = 30 },
        new NickName() { Nick = "Billy", Value = 40 },
        new NickName() { Nick = "Clint", Value = 50 },
        new NickName() { Nick = "Cindy", Value = 60 },
    });
    source = new BindingSource();
    source.DataSource = NickNames;

    txtAutoComp.AutoCompleteMode = AutoCompleteMode.Suggest;
    txtAutoComp.AutoCompleteSource = AutoCompleteSource.CustomSource;
    txtAutoComp.AutoCompleteCustomSource.AddRange(NickNames.Select(n => n.Nick).ToArray());

    Binding textBind = new Binding("Text", source, "Nick", true, DataSourceUpdateMode.OnPropertyChanged);
    textBind.Parse  = (s, evt) => {
        source.CurrencyManager.Position = NickNames.FindIndex(1, r => r.Nick.Equals(evt.Value));
    };

    txtAutoComp.DataBindings.Add(textBind);
    lblNickName.DataBindings.Add(new Binding("Text", source, "Nick"));
    lblNickValue.DataBindings.Add(new Binding("Text", source, "Value"));
}

private void btnFindNick_Click(object sender, EventArgs e)
{
    FindNick(txtAutoComp.Text);
}

private void txtAutoComp_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter) {
        e.SuppressKeyPress = true;
        FindNick(txtAutoComp.Text);
    }
}

void FindNick(string partialName) 
    => this.source.CurrencyManager.Position = NickNames.FindIndex(
        1, r => r.Nick.Contains(partialName)
    );