Я пытаюсь создать TextBox с автозаполнением.
В конструкторе моей формы я получаю данные из базы данных и устанавливаю свойство TextBox AutoCompleteCustomSource
в массив имен пользователей.
По какой-то причине функция автозаполнения не работает.
Уверен, что с методом db.getUsersList()
проблем не возникнет (скриншот внизу).
public mainPanel()
{
InitializeComponent();
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(db.getUserList().ToArray());
nickName.AutoCompleteCustomSource = collection;
}
Что означает различные виды? Вы должны указать AutoCompleteSource
. Что это такое?. Судя по тому, что вы здесь показываете, это CustomSource.
Извините, я случайно сделал это - nickName.AutoCompleteSource = nickName.AutoCompleteCustomSource;
:DD
Можете ли вы отправить это как ответ, я настрою его на ответ
Чтобы настроить элемент управления, поддерживающий автозаполнение, необходимо указать источник функции автозаполнения. При установке коллекции строк с использованием свойства AutoCompleteCustomSource свойство источник автозаполнения должно быть установлено в значение AutoCompleteSource.CustomSource, а свойство AutoCompleteMode — либо в AutoCompleteMode.SuggestAppend
, либо в AutoCompleteMode.Suggest
.
Эти свойства должны использоваться вместе указывают, как работает функция автозаполнения.
Поскольку кажется, что код в вопросе использует какой-то источник данных для создания коллекции AutoCompleteCustomSource
, вот общий пример, который создает CustomSource
из List<class>
, добавляет привязки к элементам управления с помощью класса Binding
и обновляет значения некоторых элементов управления с помощью а BindingSource
.
В примере, как видно из визуального примера, используются три элемента управления: текстовое поле (txtAutoComp
), где включена функция автозаполнения, и две метки (lblNickName
и lblNickValue
), привязанные к одному и тому же источнику данных, которые обновляются, когда текст автозаполнения контролировать изменения.
Автозаполнение расширено, чтобы позволить находить элементы, используя неполные строки, либо нажав кнопку (btnFindNick
, здесь), либо нажав клавишу Enter
в текстовом поле:
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)
);
Вы также установили
nickName.AutoCompleteSource = AutoCompleteSource.CustomSource;
иnickName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
(илиAutoCompleteMode.Suggest
)? Кстати, вы можете просто:nickName.AutoCompleteCustomSource.AddRange(db.getUserList().ToArray())
. AutoCompleteCustomSource уже является AutoCompleteStringCollection: вам не нужен другой, чтобы установить его, вы можете сделать это напрямую.