Вопрос по Autocomplete textbox с#

357
16 января 2017, 18:44

Есть таблица "kontr" с полями id,name,type. На форме есть textbox на нем стоит автозаполнение из таблицы "kontr". При вводе начальных букв выводится подсказка. Как сделать так чтобы при выборе подсказки записывался id этой строки в заранее объявленную переменную?

таблица kontr
1, Вася, 1
2, Петя, 0
3. Александр, 1

код автозаполнения

    txt_kontrIn.AutoCompleteMode = AutoCompleteMode.Suggest;
    txt_kontrIn.AutoCompleteSource = AutoCompleteSource.CustomSource;
    AutoCompleteStringCollection kontrInCol = new AutoCompleteStringCollection();
    getKontrName(kontrInCol, 1); 
    txt_kontrIn.AutoCompleteCustomSource = kontrInCol;

код getcontrName

    int pid;
    private void getKontrName(AutoCompleteStringCollection col, int type)
    {
        MySqlConnection con = new MySqlConnection(core.conString);
        con.Open();
        string q = @"select name from kontr where type = "+type.ToString()+"";
        MySqlCommand cmd = new MySqlCommand(q, con);
        MySqlDataReader dr = cmd.ExecuteReader();
        if(dr.HasRows == true)
        {
            while (dr.Read())
            {
                col.Add(dr["name"].ToString());
                //Нужно чтобы еще записался id выбранной записи в переменную pid
            }
            dr.Close();
            con.Close();
        }
    }
Answer 1

Может, я что-то не понимаю, но что мешает дополнить запрос еще одним полем

string q = @"select name, id from kontr where type = "+type.ToString()+"";

и дальше значение dr["id"] после преобразования присвоить переменной Pid?

По результатам Ваших вопросов в комментариях, сделаю следующее дополнение, которое корректирую по уже по Вашей обратной связи :). У Вас есть два варианта

  1. вместо AutoCompleteStringCollection использовать коллекцию http://stackoverflow.com/questions/21400452/autocompletestringcollection-with-tags-for-each-string
  2. использовать не ТехтBox, а ComboBox, добавляя NameId непосредственно comboBox.Items, где NameId Ваш вспомогательный класс

    class NameId 
    {
    int id;
    public int Pid   { get { return id; }  }
    string name;
    public NameId(string _name, int _id)
    {
        name = _name;
        id = _id;
    }
    public override string ToString()
    {
        return name;
    }
    }
    

Соответственно читать нужно так

    if(dr.HasRows == true)
    {
        while (dr.Read())
        {
            comboBox.Items.Add(new NameId (dr["name"].ToString(),(int)dr["id"]);
        }
        dr.Close();
        con.Close();
    }

Незабудьте про try { } catch() - это сэкономит Вам много времени.

Естественно, что это только иллюстрированная схема возможного решения Вашей проблемы, которую Вам придется "допилить напильником" уже самому :)

READ ALSO
Ошибка outofmemory при декомпрессии ab (Android Backup) файла

Ошибка outofmemory при декомпрессии ab (Android Backup) файла

На англоязычной версии сайта нашел метод, который мне очень подходит:

390
Действия формы авторизации без сохранения данных

Действия формы авторизации без сохранения данных

Знатоки, может у Вас есть идеи, как реализовать это?

314
C# Form не прогружается

C# Form не прогружается

Форма WaitingDialogcs не прогружается, но когда метод GetPage законьчил работу загрузалиась

273
Загрузка картинки в MySQL базу ASP NET MVC 5

Загрузка картинки в MySQL базу ASP NET MVC 5

приветподскажите как загрузить картинку в базу MySQL

323