Возможно вопрос покажется глупым, но мне очень нужно это.
Как сделать так, что бы при вводе строки в TextBox выводились заранее введённые данные начинающиеся с символов которые я постепенно ввожу?
(я пишу курсовую по БД… пишу приложение в ADO.NET, подключаюсь к базе данных Acsess… тема "АИС учёта компьютерного оборудования". И вот когда я добавляю данные в таблицу "Устройства" в столбец "Модель оборудования" мне необходимо, что бы например я ввожу "S" в текстовое поле TextBox и там выпадает список всех моделий, раннее введённых на "S", ввожу дальше "Sa" и выпадает к примеру "Samsung"… я выбираю мышью эту запись и все счастливы… Для ускорения ввода данных, препод требует…Вот что то типа при поиске в гугле мне нада… )
29 мая 2009 в 20:02
Коротко, полезно, отметим. тож слышал, что можно и через текст бокс делать.
29 мая 2009 в 12:04
Если нужен именно textBox, можно сделать следующим образом:
//на OnLoad формы:
…
//заполняете таблицу (не забудьте в адаптере сделать .Fill()),
//а дальше "подсовываете" сорс в текстбокс
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
foreach (ВашDataSet.ВашаТаблицаRow row in ВашаТаблица.Rows)
{
collection.Add(row.ИмяПоляКотороеНужноПодставлять);
}
ВашTextBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
ВашTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
ВашTextBox.AutoCompleteCustomSource = collection;
..
Последние строки как раз устанавливают настройки для подстановки текста из некоторого датаСорса.
29 мая 2009 в 11:00
Не-не-не, т.е. вместо твоего текст бокса делаешь комбобокс обычный и делаешь примерно то же что в методе я тебе написал (этот метод немного не от того, но смысл тот же-у комбобокса есть коллекция items, из которой можно выбирать, ты при вводе букв эту коллекцию изменяешь и юзеру показываешь), вот этот кусок:
//Zapolnenie combobox
this.Items.Clear();
DataTable dt = this.DataSource.ToTable();
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i][this.DisplayMember] != DBNull.Value)
if (!this.Items.Contains(dt.Rows[i][this.DisplayMember].ToString())) this.Items.Add((string)dt.Rows[i][this.DisplayMember].ToString());
}
dt.Dispose();
this.Select(this.Text.Length, 0); //Perehod na konec stroki v //ComboBox
this.DroppedDown = true; //Pokaz variantov
valueChanged = true; //Uvedoml Grida chto znach pomen-s
if (this.EditingControlDataGridView != null)
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
Где dt -объект DataTableкоторый справочник. Попробуй лучше методом select получать подходящие строки из нее, там синтаксис к примеру такой будет: DataTable.Select( "MasterSurname like '" + Text + "%'");
и получишь перечислитель по строкам, которые удовлетворяют условию.
Комбобокс просто може тв 3 режимах работать, тебе нужно выбрать у него в свойствах тот, который дает возможность ввода своего текста.
29 мая 2009 в 10:04
т.е. вместо комбобокса вставить текстбокс и всё?
29 мая 2009 в 10:02
Объявление класса для колонки gridview:
public abstract class GridControlEdit : ComboBox, IDataGridViewEditingControl
А это метод ее (с обычным комбобокс аналогично):
public void comboBox_TextChanged1(KeyEventArgs e)
{
// Notify the DataGridView that the contents of the cell
// have changed.
if (((e.KeyCode == Keys.Back) || (e.KeyCode == Keys.Delete)) && (this.EditingControlDataGridView != null))
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
else
if ((e.KeyCode != Keys.Up)
&& (e.KeyCode != Keys.Left)
&& (e.KeyCode != Keys.Right)
&& (e.KeyCode != Keys.Down))
//&& (e.KeyCode != Keys.Back)
//&& (e.KeyCode != Keys.Delete))
{
//Zapolnenie combobox
this.Items.Clear();
DataTable dt = this.DataSource.ToTable();
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i][this.DisplayMember] != DBNull.Value)
if (!this.Items.Contains(dt.Rows[i][this.DisplayMember].ToString()))this.Items.Add((string)dt.Rows[i][this.DisplayMember].ToString());
}
dt.Dispose();
this.Select(this.Text.Length, 0); //Perehod na konec stroki v //ComboBox
this.DroppedDown = true; //Pokaz variantov
valueChanged = true; //Uvedoml Grida chto znach pomen-s
if (this.EditingControlDataGridView != null)
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
}
}
Некоторое уже не помню чего тут делает, но танцевать пришлось не мало , чтобы этот колумн реагировал на кнопки правильно.
29 мая 2009 в 10:01
Я такое делал, данные вводятся в датагридвью, для нее пишется элемент управления DataGridViewColumn, который наследуется от Combobox с выбором и возможностью ввода своих значений. далее на он чейндж Формируется список из справочника и дается в items комбобоксу, после чег оон раскрывае6тся. В DataGridView есть типа ComboboxColumn, но он позволяет только выбирать, а не давать список по первой букве.
В твоем случае, если ввод идет просто в текстбокс, то логика та же, делай комбобокс с возможностью ввода и заполняй items.
По поводу твоего текста, он откровенно кривой, куча объектов создается в часто пояляющемся событии. И по крайней мере по быстродействию я бы залил в DataTable нужный справочник и ее методом select выбирал бы подходящие значения. В коде я не использую select, почему не помню, кстати select с ADO.NET, а не линку, так что .NET 2.0 для него точно хватит.
Еще есть компоненты от сторонних разработчиков, где эта функциональность стандартная.
29 мая 2009 в 9:04
Обязательно текстбокс нужен? Может лучше использовать комбобокс(или как там в C# зовется текстбокс с выпадающим списком). Нужно будет только его список заполнять из базы.
С C# я мало знаком, но такое ощущение, что запрос к БД сформирован, но на выполнение не запущен и соответсвенно данные из БД не получены.
И сам запрос немного некорректен. Если чьи-то шаловливые ручки введут модель с кавычками, то твой запрос немного сломается Нужно экранировать AddModYstr.Text
Полученные из БД данные запихнуть в AddModYstr.Text, думаю, не проблема %)
Только перед запихиванием неплохо бы сохранить текущую длинну введенных данных, а после запихивания вернуть курсор на прежнее место, а добавленный кусок выделить.
29 мая 2009 в 0:03
Используй событие onChange текстбокса
29 мая 2009 в 0:03
я понял… там нужно выбрать событие…
вот у меня только проблемка есть… я не знаю как поместить данные выбранные из таблицы в текстбокс…
private void Modchanged(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"..\..\Komp.mdb";
con.Open();
DataTable R = new DataTable();
R.Rows.Clear();
OleDbDataAdapter DA = new OleDbDataAdapter("Select Model From Ystroistva Where Left(Model," + AddModYstr.Text.Length + ")='" + AddModYstr.Text + "'", con);
а тут я не знаю как всунуть данные в текстбокс %)
}