AutoCompleteCustomSource с данными имен пользователей не работает - PullRequest
1 голос
/ 06 апреля 2019

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

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

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

enter image description here

1 Ответ

1 голос
/ 07 апреля 2019

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

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

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

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

TextBox 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)
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...