Как обновлять таблицу в DataGridView?

Рейтинг: 0Ответов: 1Опубликовано: 14.03.2023

такая вот проблема: мне требуется обновить таблицу по кнопки. Сама таблица считается репликой таблицы с базы данных. Код ниже:

public static void Table_Fill(string name, string sql) // метод по заполнению таблиц
        {
            if (ds.Tables[name] !=null)
                ds.Tables[name].Clear();
            SqlDataAdapter dat = new SqlDataAdapter(sql, conn);
            dat.Fill(ds,name);
            conn.Close();
        }

Connection.Table_Fill("Номер", "select Nomer.id_nomer as 'Номер комнаты', Category.name as 'Название категории', " +
                "Category.description as 'Описание', Category.price_day as 'Стоимость за сутки', Category.kol_room as 'Количество комнат' " +
                "from Nomer inner join Category on Nomer.id_category=Category.id_category where status='свободен';");

Обычно я обновлял таблицы по индексу, который брал по нажатию на нужную строку в таблице. Код ниже:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                DataGridViewRow selectedRow = dataGridView1.Rows[e.RowIndex];
                id_contract = selectedRow.Cells["Номер договора"].Value.ToString();
                n = e.RowIndex;
                id_nomer = selectedRow.Cells["Номер комнаты"].Value.ToString();
            }
        }
private void button1_Click(object sender, EventArgs e)
        {
            string sql = $"DELETE FROM Contract where id_contract ={id_contract}";
            string sql1 = $"UPDATE Nomer SET status='свободен' WHERE id_nomer={id_nomer}";
            Connection.Modification_Execute(sql);
            Connection.Modification_Execute(sql1);
           
            try
            {
                Connection.ds.Tables["Договор"].Rows.RemoveAt(n);
                Connection.ds.Tables["Номер"].Constraints.Clear();
                Connection.Table_Fill("Номер", "select Nomer.id_nomer as 'Номер комнаты', Category.name as 'Название категории', " +
                    "Category.description as 'Описание', Category.price_day as 'Стоимость за сутки', Category.kol_room as 'Количество комнат' " +
                    "from Nomer inner join Category on Nomer.id_category=Category.id_category where status='свободен';");
                MessageBox.Show("Договор успешно удален","Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Кто может подсказать , как сделать, чтобы не приходилось лишний раз стирать таблицу и по новому запросу ее заполнять. Я раньше делал так, прошу прощения за скрин, код не остался:введите сюда описание изображения

Я бы его использовал, только вот не знаю как с ним работать когда, у меня меняется только один столбец (status). Может кто подсказать?

Ответы

▲ 1

У SqlDataAdapter есть метод Update(), туда можно передать Dataset и Таблицу, так же при помощи класса SqlCommandBuilder сгенерировать команды для SqlDataAdapter, пример:

            TicketsAdapter = new SqlDataAdapter("SELECT * FROM Tickets", Settings.Default.ConnectionString);
            TicketsAdapter.Fill(Tickets);
            
            SqlCommandBuilder builder = new SqlCommandBuilder(TicketsAdapter);
            TicketsAdapter.UpdateCommand = builder.GetUpdateCommand();
            TicketsAdapter.DeleteCommand = builder.GetDeleteCommand();
            TicketsAdapter.InsertCommand = builder.GetInsertCommand();

TicketsAdapter - глобальная переменная класса SqlDataAdapter; Tickets - DataTable, При нажатии на кнопку вызывается TicketsAdapter.Update(Tickets); Если таблица назначена у DataGrid как DataSourse, то изменения подхватятся автоматически и можно смело удалять/создавать новые записи/изменять в DataGrid, они сохранятся при нажатии на кнопку