none
Данные SQL из Combobox в Textbox RRS feed

  • Вопрос

  • Добрый день. Надеюсь хоть вы мне поможете. У меня есть приложение с базой данных (ЛОКАЛЬНАЯ БД!!!). В правой части я заполняю данные. И добавляю их в базу данных, которая затем отображает эти данные в comboBox. Но как потом выбирая данные из comboBox отправить их обратно в textBox'ы, которые расположены в левой части приложения?

    Этот вариант кода возвращает только одну строчку данных. Но а если их две, то все равно отображается только первая

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
             SqlCeCommand cmd = new SqlCeCommand("Select Name,Surname, Phone, Mail, Address from Persons", cn);
                cmd.Parameters.AddWithValue("@Name", comboBox1.Text);
                cmd.Parameters.AddWithValue("@Surname", comboBox1.Text);
                cmd.Parameters.AddWithValue("@Phone", comboBox1.Text);
                cmd.Parameters.AddWithValue("@Mail", comboBox1.Text);
                cmd.Parameters.AddWithValue("@Address", comboBox1.Text);
                cn.Open();
                SqlCeDataReader read = cmd.ExecuteReader();
                if (read.Read())
                {
                    textBox2.Text = Convert.ToString(read[0]);
                    textBox3.Text = Convert.ToString(read[1]);
                    textBox4.Text = Convert.ToString(read[2]);
                    textBox5.Text = Convert.ToString(read[3]);
                    textBox6.Text = Convert.ToString(read[4]);
    
                } cn.Close(); 
            }
    Это видео мне тоже не помогло Видео


    • Изменено Marcel Bagautdinov 26 октября 2014 г. 13:32 Ошибочная ссылка
    26 октября 2014 г. 13:28

Ответы

Все ответы

  • Добрый день.

    Если у вас в ComboBox данные грузятся целиком строкой из БД, то я бы показывая ФИО, искал бы по первичному ключу. Т.е. в ComboBox выбирают человека, вы модифицируете запрос вот так:

    SqlCeCommand cmd = new SqlCeCommand("Select Name,Surname, Phone, Mail, Address from Persons where uid = @uid", cn);
    cmd.Parameters.AddWithValue("@uid", comboBox1.SelectedValue);
    

    В этом случае у вас будет считана из базы только одна строка.

    И, да, не надо добавлять возвращаемые столбцы в качестве параметров при Select-е.

    27 октября 2014 г. 6:35
    Отвечающий
  • Сделал, как Вы описали, но выдало ошибку 

    Вот код

     private void comboBox1_DropDownClosed(object sender, EventArgs e)
            {
                try
                {
                    SqlCeCommand cmd = new SqlCeCommand("Select Name,Surname, Phone, Mail, Address, Pics from Persons where uid=@uid", cn);
                    cmd.Parameters.AddWithValue("@uid", comboBox1.SelectedValue);
                    cn.Open();
                    SqlCeDataReader read = cmd.ExecuteReader();
                    if (read.Read())
                    {
                        textBox2.Text = Convert.ToString(read[0]);
                        textBox3.Text = Convert.ToString(read[1]);
                        textBox4.Text = Convert.ToString(read[2]);
                        textBox5.Text = Convert.ToString(read[3]);
                        textBox6.Text = Convert.ToString(read[4]);
                        imgData = (byte[])(read["Pics"]);
                        if (imgData == null)
                            pictureBox1.Image = null;
                        else
                        {
                            MemoryStream stream = new MemoryStream(imgData);
                            pictureBox1.Image = System.Drawing.Image.FromStream(stream);
                        }
    
                    } cn.Close(); 
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

    вот таблица БД

    

    и кстати после удаления строк, нумерация uid идет не сначала

    27 октября 2014 г. 8:10
  • Странно, вроде все правильно, ну попробуйте вот так:

    SqlCeCommand cmd = new SqlCeCommand("Select Name,Surname, Phone, Mail, Address, Pics from Persons where uid=" + comboBox1.SelectedValue, cn);
    

    И, кстати, вы настроили ComboBox, какой столбец использовать в качестве Value?
    27 октября 2014 г. 8:37
    Отвечающий
  • Так ошибки нет, но данные  текстбоксов пустые. Я могу переслать проект для удобства. Только сделаю БД транспортабельную =)
    27 октября 2014 г. 8:58
  • И, кстати, вы настроили ComboBox, какой столбец использовать в качестве Value?

    Вы вот это посмотрели?

    Поставьте точку останова и проверьте что находится в SelectedValue

    27 октября 2014 г. 9:02
    Отвечающий
  • Первичный ключ у меня uid, до этого был Name. Результат тот же.

    Проект

    27 октября 2014 г. 9:16
  • Данные на точке останова в комбобоксе
    27 октября 2014 г. 9:23
  • Ну вот, все правильно, вы ComboBox не настроили. Посмотрите что такое SelectedValue. Ну и настройте корректно ValueMember. По второй ссылке весьма недурственный пример.

    • Помечено в качестве ответа Marcel Bagautdinov 27 октября 2014 г. 11:15
    • Снята пометка об ответе Marcel Bagautdinov 27 октября 2014 г. 13:33
    • Помечено в качестве ответа Marcel Bagautdinov 28 октября 2014 г. 9:04
    27 октября 2014 г. 9:28
    Отвечающий
  • Это мне надо вернуться туда где данные с БД идут в комбобокс?

    Вот его код

    SqlCeCommand cmd = new SqlCeCommand(
                    "Select Name, Surname from Persons", cn);
                SqlCeDataReader dr;
                try
                {
                    cn.Open();
                    dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        if (!comboBox1.Items.Contains(dr[1] + " " + dr[0]))
                            comboBox1.Items.Add(dr[1] + " " + dr[0]);
                    }
                    cn.Close();

    27 октября 2014 г. 9:46
  • Вы посмотрели пример? У меня есть ощущение, что нет. Посмотрите, создайте вспомогательный класс, в него пишите uid и ФИО, настройте ComboBox.

    Кстати, а почему вы используете DataReader, почему не DataSet или EntityFramework?

    • Помечено в качестве ответа Marcel Bagautdinov 27 октября 2014 г. 11:15
    • Снята пометка об ответе Marcel Bagautdinov 27 октября 2014 г. 13:33
    27 октября 2014 г. 9:55
    Отвечающий
  • Я начал разбирать пример из видео сначала так по всему коду у меня и пошло
    27 октября 2014 г. 10:16
  • Пример смотрел. Не понял зачем там нужны {get;set}
    27 октября 2014 г. 10:29
  • Эти привязки работают со свойствами...

    27 октября 2014 г. 10:30
    Отвечающий
  • Ну сделал как в примере. Но при этом теперь у меня отображается только имя во всех полях текстбокса
    27 октября 2014 г. 10:53
  • Судя по картинке приведенной вами выше, у вас во всех столбцах одинаковые значения...

    27 октября 2014 г. 10:55
    Отвечающий
  • Разные. MyName, MySurname, MyPhone. И кстати отображается не имя а Фамилия почему-то, хотя в комбобоксе имя.
     private void loadList()
            {
                string Querry = "Select Name, Surname from Persons";
                SqlCeDataAdapter da = new SqlCeDataAdapter(Querry, cn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                comboBox1.DataSource = ds.Tables[0];
                comboBox1.DisplayMember = "Name";
                comboBox1.ValueMember = "Surname";
               
            }
    
       private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
            {
                        if (comboBox1.SelectedIndex != -1)
                        {
                            textBox2.Text = comboBox1.SelectedValue.ToString();
                            textBox3.Text = comboBox1.SelectedValue.ToString();
                            textBox4.Text = comboBox1.SelectedValue.ToString();
                            textBox5.Text = comboBox1.SelectedValue.ToString();
                            textBox6.Text = comboBox1.SelectedValue.ToString();
                        }


    27 октября 2014 г. 10:57
  • Ага, а значения в них совпадают...
    27 октября 2014 г. 10:58
    Отвечающий
  • Еще раз, в ValueMember необходимо помещать UID, при изменении выбранного элемента лезть по этому UID в базу (как я показывал выше) и выбирать остальные поля по записи и показывать их.
    28 октября 2014 г. 6:56
    Отвечающий