Combobox 2 столбца и сохранение значения

Tr@$ter

Добрый день! Есть код
private void btnTest_Click(object sender, EventArgs e)
{
            string connectionStringTest = "SERVER=GW;DATABASE=VSQL;Trusted_Connection=True";
            SqlConnection cs = new SqlConnection(connectionStringTest);
            SqlDataAdapter da = new SqlDataAdapter("SELECT * from tbl_worker order by LastName", cs);
            DataTable dt = new DataTable();
 
            da.Fill(dt);
 
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                cmbTest.Items.Add(dt.Rows[i]["LastName"]);
               
            }
        }
Данные из столбца LastName прекрасно выводятся в комбобокс cmbTest. Но при выборе никаких значений не сохраняется. Как лучше реализовать вывод выбранного значения в MessageBox, например. И как осуществить вывод в комбобокс значений из двух и более столбцов, например: LastName и FirstName, так чтобы получилось, например Иванов Иван? Заранее спасибо, за ответы.
8 ответов

Tr@$ter

используй свойства DisplayMember и ValueMember
cmbTest.DataSource = dt;
cmbTest.DisplayMember = "LastName"; //то что должно отображаться
cmbTest.ValueMember = "ID";  //поле, для определения того, что выбрали, например Primary Key в таблице
в cmbTest.SelectedValue() будет содержимое ValueMember выбранной записи


Tr@$ter

Переделал так:
string connectionString = "Data Source=GW;Initial Catalog=VSQL;Integrated Security=True";
            string CommandText = "SELECT * FROM tbl_worker";
            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();
            SqlCommand myCommand = conn.CreateCommand();
            myCommand.CommandText = CommandText;
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = myCommand;
            DataSet ds = new DataSet();
            dataAdapter.Fill(ds, "tbl_worker");
            ds.Tables["tbl_worker"].Columns.Add("fio", typeof(string), "Lastname+' '+Firstname+' '+Secondname");
            conn.Close();
            cmbTest.DataSource = ds.Tables["tbl_worker"];
            cmbTest.ValueMember = "id_sotrudnic";
            cmbTest.DisplayMember = "fio";
Значения заносятся. но теперь сразу же заполняется комбобокс первым значением из отбора. Как сделать, чтобы если пользователь ничего не выбрал, то и поле бы считалось не заполненным?


Tr@$ter

Переделал так:
string connectionString = "Data Source=GW;Initial Catalog=VSQL;Integrated Security=True";
            string CommandText = "SELECT * FROM tbl_worker";
            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();
            SqlCommand myCommand = conn.CreateCommand();
            myCommand.CommandText = CommandText;
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = myCommand;
            DataSet ds = new DataSet();
            dataAdapter.Fill(ds, "tbl_worker");
            ds.Tables["tbl_worker"].Columns.Add("fio", typeof(string), "Lastname+' '+Firstname+' '+Secondname");
            conn.Close();
            cmbTest.DataSource = ds.Tables["tbl_worker"];
            cmbTest.ValueMember = "id_sotrudnic";
            cmbTest.DisplayMember = "fio";
Значения заносятся. но теперь сразу же заполняется комбобокс первым значением из отбора. Как сделать, чтобы если пользователь ничего не выбрал, то и поле бы считалось не заполненным?
Не понятно что надо очистить. Если надо очистить cmbTest.Text, это одно, а если выбранный индекс, то тоже можно, но смысл в этом? Для того, чтобы показывать пользователю, что он ничего пока не выбрал, иногда используют запись в базе данных, например, "Не выбрано", которая идет первой, но этот стиль считаю неправильным.


Tr@$ter

Не понятно что надо очистить. Если надо очистить cmbTest.Text, это одно, а если выбранный индекс, то тоже можно, но смысл в этом? Для того, чтобы показывать пользователю, что он ничего пока не выбрал, иногда используют запись в базе данных, например, "Не выбрано", которая идет первой, но этот стиль считаю неправильным.
Добавил:
cmbTest.Text = null;
Но в таблицу всё равно попадает "0". Хотелось бы вообще пустое поле. Как?


Tr@$ter

Добавил:
cmbTest.Text = null;
Но в таблицу всё равно попадает "0". Хотелось бы вообще пустое поле. Как?
Ноль попадает сюда id_?sotrudnic Ну можно принудительно перед записью выставить
id_?sotrudnic = null
если база данных позволяет. А как ты собираешься с пустым идентификатором работать?


Tr@$ter

Ноль попадает сюда id_?sotrudnic Ну можно принудительно перед записью выставить
id_?sotrudnic = null
если база данных позволяет. А как ты собираешься с пустым идентификатором работать?
В access, если выбор не произведён, то в sql значений никаких не ставиться (в базе в ячейке NULL). Как из C# реализовать так же?


Tr@$ter

В access, если выбор не произведён, то в sql значений никаких не ставиться (в базе в ячейке NULL). Как из C# реализовать так же?
Вопрос не в C#. Идентификатор в базе данных для уникальности, как правило. Если задать условие что идентификатор может быть null, то смысла в такой базе данных нет. Так как записей с null в идентификаторе можно насохранять сколько угодно и потом работать с такой базой данных нельзя будет нормально. Может я не правильно понимаю? Возможно тебе надо другое условие, если пользователь "не выбрал" в комбобоксе, то запись в базу данных не сохранять.


Tr@$ter

Возможно тебе надо другое условие, если пользователь "не выбрал" в комбобоксе, то запись в базу данных не сохранять.
Да именно это мне и нужно.Пока так:
string cmbValue = cmbTest.Text == "" ? "NULL" : "'" + cmbTest.SelectedValue + "'";
И в запрос закинул.