singlepost

Вопрос по C# << На главную или назад  

Возможно вопрос покажется глупым, но мне очень нужно это.

Как сделать так, что бы при вводе строки в TextBox выводились заранее введённые данные начинающиеся с символов которые я постепенно ввожу?

(я пишу курсовую по БД… пишу приложение в ADO.NET, подключаюсь к базе данных Acsess… тема "АИС учёта компьютерного оборудования". И вот когда я добавляю данные в таблицу "Устройства" в столбец "Модель оборудования" мне необходимо, что бы например я ввожу "S" в текстовое поле TextBox и там выпадает список всех моделий, раннее введённых на "S", ввожу дальше "Sa" и выпадает к примеру "Samsung"… я выбираю мышью эту запись и все счастливы… Для ускорения ввода данных, препод требует…Вот что то типа при поиске в гугле мне нада… )

22 ответов в теме “Вопрос по C#”

  1. 9
    Евгений Баталов ответил:

    Коротко, полезно, отметим. тож слышал, что можно и через текст бокс делать.

  2. 8
    Людмила Уланова ответил:

    Если нужен именно 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;
    ..

    Последние строки как раз устанавливают настройки для подстановки текста из некоторого датаСорса.

  3. 7
    Евгений Баталов ответил:

    Не-не-не, т.е. вместо твоего текст бокса делаешь комбобокс обычный и делаешь примерно то же что в методе я тебе написал (этот метод немного не от того, но смысл тот же-у комбобокса есть коллекция 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 режимах работать, тебе нужно выбрать у него в свойствах тот, который дает возможность ввода своего текста.

  4. 6
    Игорь Анатольевич ответил:

    т.е. вместо комбобокса вставить текстбокс и всё?

  5. 5
    Евгений Баталов ответил:

    Объявление класса для колонки 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);
    }
    }

    Некоторое уже не помню чего тут делает, но танцевать пришлось не мало , чтобы этот колумн реагировал на кнопки правильно.

  6. 4
    Евгений Баталов ответил:

    Я такое делал, данные вводятся в датагридвью, для нее пишется элемент управления DataGridViewColumn, который наследуется от Combobox с выбором и возможностью ввода своих значений. далее на он чейндж Формируется список из справочника и дается в items комбобоксу, после чег оон раскрывае6тся. В DataGridView есть типа ComboboxColumn, но он позволяет только выбирать, а не давать список по первой букве.
    В твоем случае, если ввод идет просто в текстбокс, то логика та же, делай комбобокс с возможностью ввода и заполняй items.
    По поводу твоего текста, он откровенно кривой, куча объектов создается в часто пояляющемся событии. И по крайней мере по быстродействию я бы залил в DataTable нужный справочник и ее методом select выбирал бы подходящие значения. В коде я не использую select, почему не помню, кстати select с ADO.NET, а не линку, так что .NET 2.0 для него точно хватит.
    Еще есть компоненты от сторонних разработчиков, где эта функциональность стандартная.

  7. 3
    Евгений Тюкавкин ответил:

    Обязательно текстбокс нужен? Может лучше использовать комбобокс(или как там в C# зовется текстбокс с выпадающим списком). Нужно будет только его список заполнять из базы.

    С C# я мало знаком, но такое ощущение, что запрос к БД сформирован, но на выполнение не запущен и соответсвенно данные из БД не получены.
    И сам запрос немного некорректен. Если чьи-то шаловливые ручки введут модель с кавычками, то твой запрос немного сломается :) Нужно экранировать AddModYstr.Text
    Полученные из БД данные запихнуть в AddModYstr.Text, думаю, не проблема %)
    Только перед запихиванием неплохо бы сохранить текущую длинну введенных данных, а после запихивания вернуть курсор на прежнее место, а добавленный кусок выделить.

  8. 2
    Дмитрий Коковцев ответил:

    Используй событие onChange текстбокса

  9. 1
    Игорь Анатольевич ответил:

    я понял… там нужно выбрать событие…
    вот у меня только проблемка есть… я не знаю как поместить данные выбранные из таблицы в текстбокс…

    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);

    а тут я не знаю как всунуть данные в текстбокс %)

    }

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.