С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 14

Update БД из DataGridviewComboBoxColumn

17.04.2013, 14:25. Показов 2370. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Требуется обновить грид по нажатию кнопки. Дело в том, что в гриде имеются comboboxcolumn, с обновлением которых возникает проблема.

Заполнение грида
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
        public void GridPrepod()
        {
            try
            {
                string selectPrepod = String.Format(@"SELECT Преподаватель.ID_преподавателя,  Преподаватель.Фамилия, y1.ID_степени, y2.ID_степени
 FROM Преподаватель join Учёная_степень y1
     on Преподаватель.Учёная_степень = y1.ID_степени 
     join Учёная_степень y2 on Преподаватель.Учёная_степень_2 = y2.ID_степени");
                
                da = new SqlDataAdapter(selectPrepod, cnn);
                dt = new DataTable();
 
                da.Fill(dt);
                dgvPrepod.DataSource = dt;
 
                dgvPrepod.Columns["ID_преподавателя"].Visible = false;
                dgvPrepod.Columns["ID_степени"].Visible = false;
 
                //Комбо Учёная степень
                string SelStep1 = String.Format(@"Select ID_степени, Наименование From Учёная_степень");
                daStep1 = new SqlDataAdapter(SelStep1, cnn);
                dtStep1 = new DataTable();
                daStep1.Fill(dtStep1);
                DataGridViewComboBoxColumn cBstep1 = new DataGridViewComboBoxColumn();
 
                cBstep1.DataSource = dtStep1;
                cBstep1.ValueMember = "ID_степени";
                cBstep1.DisplayMember = "Наименование";
                cBstep1.DataPropertyName = "ID_степени";
                cBstep1.HeaderText = "Учёная степень";
 
                dgvPrepod.Columns.Add(cBstep1);
 
                //Комбо Учёная степень 2
                string SelStep2 = String.Format(@"Select ID_степени, Наименование From Учёная_степень");
                daStep2 = new SqlDataAdapter(SelStep2, cnn);
                dtStep2 = new DataTable();
                daStep2.Fill(dtStep2);
                DataGridViewComboBoxColumn cBstep2 = new DataGridViewComboBoxColumn();
 
                cBstep2.DataSource = dtStep2;
                cBstep2.ValueMember = "ID_степени";
                cBstep2.DisplayMember = "Наименование";
                cBstep2.DataPropertyName = "ID_степени1";
                cBstep2.HeaderText = "Учёная степень 2";
 
                dgvPrepod.Columns.Add(cBstep2);
 
             catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

Обновление грида

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void btnChange_Click(object sender, EventArgs e)
        {
            try
            {
                SqlCommand command = new SqlCommand(@"Update Преподаватель 
                Set Фамилия = @family, Имя = @name, Отчество=@otch, Учёное_звание=@zvan, 
                Учёная_степень=@step, Учёная_степень_2=@step2, Должность=@dolzh,                   Должность_по_совместительству=@dolzh2,  Шт_ед=@shtat, Контактный_телефон=@tel
where ID_преподавателя=@id", cnn);
 
                SqlParameter parametr = null;
 
                parametr = new SqlParameter("@family", SqlDbType.VarChar, 50);
                parametr.SourceColumn = "Фамилия";
                command.Parameters.Add(parametr);
 
                command.Parameters.Add("@step", SqlDbType.Int, 4);
                command.Parameters["@step"].Value = dgvPrepod.CurrentRow.Cells[4].Value;
 
                command.Parameters.Add("@step2", SqlDbType.Int, 4);
                command.Parameters["@step2"].Value = dgvPrepod.CurrentRow.Cells[5].Value;
                
                command.Connection = cnn;
                da.UpdateCommand = command;
                da.Update(dt);
 
             catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
 
            finally
            {
                cnn.Close();
            }
Сделал пока dgvPrepod.CurrentRow.Cells[11].Value;
Как выбрать строку, где произошло изменение и именно оттуда взять значение для update?

Добавлено через 1 час 56 минут
Прошу прощения, криво скопировал код обновления:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private void btnChange_Click(object sender, EventArgs e)
        {
            try
            {
                SqlCommand command = new SqlCommand(@"Update Преподаватель 
                Set Фамилия = @family,  Учёная_степень=@step, Учёная_степень_2=@step2
where ID_преподавателя=@id", cnn);
 
                SqlParameter parametr = null;
 
                parametr = new SqlParameter("@family", SqlDbType.VarChar, 50);
                parametr.SourceColumn = "Фамилия";
                command.Parameters.Add(parametr);
 
                command.Parameters.Add("@step", SqlDbType.Int, 4);
                command.Parameters["@step"].Value = dgvPrepod.CurrentRow.Cells[4].Value;
 
                command.Parameters.Add("@step2", SqlDbType.Int, 4);
                command.Parameters["@step2"].Value = dgvPrepod.CurrentRow.Cells[5].Value;
 
                parametr = new SqlParameter("@id", SqlDbType.Int, 4);
                parametr.SourceColumn = "ID_преподавателя";
 
                command.Parameters.Add(parametr);                
 
                command.Connection = cnn;
                da.UpdateCommand = command;
                da.Update(dt);
 
             catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
 
            finally
            {
                cnn.Close();
            }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2013, 14:25
Ответы с готовыми решениями:

Не получается сделать Update (Update requires a valid InsertCommand)
Не получается сделать Update выдаёт ошибку, что делаю не так? В таблице только одно поле, оно строковое. public void...

DataGrid update ПРОБЛЕМА: Key column information is insufficient or incorect. Too many rows were affected by update
Привет всем ! В Вижуал Басик6 на форме имею ДатаГрид с информацией из Аксцессс 2000. Соединение - АДО. Пропертями усе установленно...

Дедлоки между update limit N и update по primary key
Добрый день! Столкнулся с дедлоками, хотелось бы послушать опытных товарищей как с этим быть. Описание: Есть табличка CREATE...

4
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.04.2013, 15:22
Что вам мешает задать SourceColumn для всех параметров, а не для половины и забыть про "ручной" поиск строк, в которые были внесены изменения? За вас это сделает DataAdapter.Update.
PS: Чем ваш запрос на выборку данных лучше, чем следующий?
T-SQL
1
2
SELECT ID_преподавателя, Фамилия, Ученая_степень, Ученая_степень_2
    FROM Преподаватель
Вся информация, которые вы выбираете в DataTable, содержится в одной таблице. Зачем вам к ней джонить еще две?
0
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 14
17.04.2013, 16:13  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Что вам мешает задать SourceColumn для всех параметров, а не для половины
ругается, "Параметризованный запрос ожидает параметр "@step", который не был указан"

Цитата Сообщение от kodv Посмотреть сообщение
Вся информация, которые вы выбираете в DataTable, содержится в одной таблице. Зачем вам к ней джонить еще две?
По полям Ученая_степень, Ученая_степень_2 таблица Преподаватель связана с таблицей Учёная_степень, из которой они берут разные значения
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.04.2013, 16:23
Цитата Сообщение от SupNatRus Посмотреть сообщение
ругается, "Параметризованный запрос ожидает параметр "@step", который не был указан"
Вы хоть поняли, что я спросил? Он так ругается, когда уже выполняется метод Update. А я говорил про свойство SourceColumn. Есть ваш кусок кода:
C#
1
2
                parametr = new SqlParameter("@id", SqlDbType.Int, 4);
                parametr.SourceColumn = "ID_преподавателя";
. Что вам мешает аналогично задать и остальные параметры?
C#
1
2
3
4
                parametr = new SqlParameter("@step", SqlDbType.Int, 4);
                parametr.SourceColumn = "Ученая_степень"; 
                parametr = new SqlParameter("@step2", SqlDbType.Int, 4);
                parametr.SourceColumn = "Ученая_степень_2";
Цитата Сообщение от SupNatRus Посмотреть сообщение
По полям Ученая_степень, Ученая_степень_2 таблица Преподаватель связана с таблицей Учёная_степень, из которой они берут разные значения
В том запросе, который у вас написан здесь, все значения содержатся в одной таблице.
0
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 14
17.04.2013, 16:37  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Что вам мешает аналогично задать и остальные параметры?
так вот именно когда я задаю так параметры для столбцов combobox, он и ругается



Цитата Сообщение от kodv Посмотреть сообщение
В том запросе, который у вас написан здесь, все значения содержатся в одной таблице.
FROM Преподаватель join Учёная_степень y1 ... join Учёная_степень y2
а в таблице преподаватель поля Учёная_степень, Учёная_степень2 - id для связи со второй таблицей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2013, 16:37
Помогаю со студенческими работами здесь

DataGridViewComboBoxColumn
Доброго времени суток. Не давно начал изучать программирование, и решил попробовать написать небольшое оконное приложение. Помогите...

Использование DataGridViewComboBoxColumn
Добрый день! Помогите, пожалуйста решить проблему. Надо в DataGridView для всех ячеек сделать выпадающий список. На данный момент имеется...

Работа с DataGridViewComboBoxColumn
Всем здравствуйте. помогите пожалуйста разобраться. Есть 4 колонки 2 из них DataGridViewComboBoxColumn. Код программы создания...

Заполнение DataGridViewComboBoxColumn из БД
Есть combobox и datagridview на форме. combobox заполняю из БД NpgsqlConnection conn = new NpgsqlConnection(Conection_string);...

DataGridViewComboBoxColumn из базы
Добрый день! есть ли у кого-то пример кода использования DataGridViewComboBoxColumn Мне надо что бы одна из колонок содержала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru