Текстовое поле автоматически завершено (Multi Line)
Я делаю автоматическое предложение/полное текстовое поле в С#, я следую ссылке ниже, но текстовое поле не показывает предложения
Как создать текстовое поле autosuggest в формах Windows?
//-------- Get all distinct description -----------------------------
OleDbCommand command = new OleDbCommand(Queries.qry16, Connection);
OleDbDataReader reader = command.ExecuteReader();
//--------- Storing ------------------------------------
while (reader.Read())
{
namesCollection.Add(reader.GetValue(0).ToString());
}
//----------- Close after use ---------------------------------------
reader.Close();
//----------- Set the auto suggestion in description box ------------
descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
descriptionBox.AutoCompleteCustomSource = namesCollection;
Вот мой код, это функция загрузки winform. И инициализация nameCollection находится в конструкторе... любезно, пожалуйста, помогите, чтобы он работал.
Я редактирую свой пост, а затем создаю новый... Я пробовал собственный код в текстовом поле с одной строкой, и он работал. Теперь я хочу то же самое в нескольких линиях... Для исследований я googled более двух дней, пробовав разные коды (один с понятием intelli), но он не работал как автоматическое предложение, доступное в текстовом поле. Может ли кто-нибудь дать мне предложение закодировать всю процедуру на несколько строк. Спасибо.
Ответы
Ответ 1
AutoCompleteSource не работает с многострочными элементами управления TextBox.
Это означает, что вам нужно сделать это с нуля:
Я бы сделал ListBox для отображения содержимого вашего автозаполнения:
var listBox = new ListBox();
Controls.Add(listBox);
Вам нужно обработать события в текстовом поле, но это немного грубо, поэтому я бы переписал его, чтобы остановить keyupevent в какой-то момент:
private void textBox_KeyUp(object sender, KeyEventArgs e)
{
var x = textBox.Left;
var y = textBox.Top + textBox.Height;
var width = textBox.Width + 20;
const int height = 40;
listBox.SetBounds(x, y, width, height );
listBox.KeyDown += listBox_SelectedIndexChanged;
List<string> localList = list.Where(z => z.StartsWith(textBox.Text)).ToList();
if(localList.Any() && !string.IsNullOrEmpty(textBox.Text))
{
listBox.DataSource = localList;
listBox.Show();
listBox.Focus();
}
}
Теперь все, что вам нужно, это обработчик для установки текста в текстовом поле:
void listBox_SelectedIndexChanged(object sender, KeyEventArgs e)
{
if(e.KeyValue == (decimal) Keys.Enter)
{
textBox2.Text = ((ListBox)sender).SelectedItem.ToString();
listBox.Hide();
}
}
Поместите нулевые проверки, где это уместно
Ответ 2
Вам нужно добавить класс "Новый компонент", добавив "Новый элемент". а затем напишите код для этого класса, а затем добавьте этот компонент, где это необходимо..
Ответ 3
Попробуйте этот код, поскольку он работает в моем случае:
AutoCompleteStringCollection MyCollection = new AutoCompleteStringCollection();
while (reader.Read())
{
namesCollection.Add(reader.GetString(0));
}
reader.Close();
descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
descriptionBox.AutoCompleteCustomSource = namesCollection;
con.Close();
Проверьте, читает ли читатель нужные записи..:)
Ответ 4
Немного путаницы в "автообновлении", поскольку это в основном автоматическое завершение без разрешения пользователя "заполнить" текст. Тем не менее, вот несколько ссылок, которые могут вам помочь:
http://docs.jquery.com/UI/Autocomplete
Функциональность автозаполнения в текстовом поле
Автозаполнение расширителя для многострочного текстового поля
Прокрутите страницу вниз по ссылке # 2, пользователь предложил решение jquery и сравните со ссылкой # 1. Вы можете найти решение.
Третья ссылка - из форумов asp, на подобный вопрос, как ваш, также ответила ссылка. Вы можете проверить это.
Ответ 5
Это поможет вам решить проблему;
Вы можете изменить имя таблицы. вы можете изменить запрос на загрузку списка.
ListBox lbox;
private void IletisimBilgileriDoldur()
{
try
{
string strQuery= "Select adres From tblIletisimBilgileri Where adres <> '';";
veri = new OleDbCommand(strQuery,strConn);
veri.CommandType = CommandType.Text;
if (strConn.State == ConnectionState.Closed) strConn.Open();
oku = veri.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(oku);
oku.Close();
txtAdres.AutoCompleteCustomSource.Clear();
if (dt.Rows.Count >= 0)
{
lbox = new ListBox();
for (int count = 0; count < dt.Rows.Count; count++)
{
lbox.Items.Add(dt.Rows[count]["adres"].ToString());
}
}
txtAdres.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
txtAdres.AutoCompleteSource = AutoCompleteSource.CustomSource;
if (strConn.State == ConnectionState.Open) strConn.Close();
}
catch (Exception)
{
if (strConn.State == ConnectionState.Open) strConn.Close();
}
}
private void txtAdres_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
var x = txtAdres.Left;
var y = txtAdres.Top + txtAdres.Height;
var width = txtAdres.Width;
const int height = 120;
lbox.SetBounds(x, y, width, height);
lbox.KeyDown += lbox_SelectedIndexChanged;
lbox.DoubleClick += lbox_DoubleClick;
gbxAdres.Controls.Add(lbox);
lbox.BringToFront();
lbox.Show();
ActiveControl = txtAdres;
}
void lbox_DoubleClick(object sender, EventArgs e)
{
txtAdres.Text = ((ListBox)sender).SelectedItem.ToString();
lbox.Hide();
}