Как изменять/добавлять строки из datagrid в конркетную таблицу sql
В моем коде есть combobox с items представляющими собой названия таблиц, и какой item выберет пользователь, такая и откроется таблица.
Я хочу сделать редактирование/добавления выбранных пользователем строк в datagrid именно в той таблице, какую выбрал пользователь в combobox и передавал изменения в эту же самую таблицу sql.
Я знаю как это сделать для конкретной таблицы, в которой по binding перечитывать все значения и сохранять те которые изменил пользователь, а как это сделать с моими кучами таблиц по combobox я не знаю. Надеюсь вы мне поможете.
Вот код обновления по combobox:
public void UpdateDataGrid()
{
dataBase.openConnetction();
string selectedDatabase = "services"; // Строка по умолчанию
switch (Combobox_Table.SelectedIndex)
{
case 0:
selectedDatabase = "users";
break;
case 1:
selectedDatabase = "employees";
break;
case 2:
selectedDatabase = "services";
break;
case 3:
selectedDatabase = "reviews";
break;
}
string cmd = "SELECT * FROM " + selectedDatabase;
MySqlCommand createCommand = new MySqlCommand(cmd, dataBase.getConnection());
// Получение данных
MySqlDataAdapter dataAdp = new MySqlDataAdapter(createCommand);
DataTable dt = new DataTable();
dataAdp.Fill(dt);
// Установка источника данных для DataGrid
phonesGrid.ItemsSource = dt.DefaultView;
// Привязка столбцов в DataGrid
phonesGrid.Columns.Clear(); // Очищаем существующие столбцы
foreach (DataColumn column in dt.Columns)
{
DataGridTextColumn textColumn = new DataGridTextColumn()
{
Header = column.ColumnName,
Binding = new Binding(column.ColumnName) // Привязка данных
};
phonesGrid.Columns.Add(textColumn); // Добавление нового столбца
}
dataBase.CloseConnetction();
int rowCount = phonesGrid.Items.Count;
Ammout_Chip.Content = rowCount - 1;
}
Вот вариант как сделать с одной базой данных по binding:
private void Save_Chip_Click(object sender, RoutedEventArgs e) // Также выполняет функцию создания новой строки
{
try
{
// Получаем все строки из DataGrid
DataView dateview = (DataView)phonesGrid.ItemsSource;
// Получаем связанный с ним DataTable
DataTable dt = dateview.Table;
// Обновляем каждую строку
foreach (DataRow row in dt.Rows)
{
string name = row["name_product"].ToString();
int count = Convert.ToInt32(row["count_product"]);
string company = row["company_product"].ToString();
string price = row["price_product"].ToString();
string type = row["type_product"].ToString();
string country = row["country_product"].ToString();
string supplier = row["supplier_product"].ToString();
if ((string.IsNullOrEmpty(row["id"].ToString())))
{
dataBase.openConnetction();
var addquary = $"insert into <имя выбранной таблицы> (name_product, count_product, company_product, price_product, type_product, supplier_product, country_product ) values ('{name}', '{count}', '{company}', '{price}', '{type}', '{supplier}', '{country}')";
var commandadd = new MySqlCommand(addquary, dataBase.getConnection());
commandadd.ExecuteNonQuery();
MessageBox.Show("Запись успешно создана!", "Успех", MessageBoxButton.OK);
UpdateDataGrid();
}
else
{
int id = Convert.ToInt32(row["id"]);
string sqlUpdateQuery = "UPDATE <имя выбранной таблицы> SET name_product = @name, count_product = @count, company_product = @company, price_product = @price, type_product = @type, country_product = @country, supplier_product = @supplier WHERE id = @id";
dataBase.openConnetction();
MySqlCommand command = new MySqlCommand(sqlUpdateQuery, dataBase.getConnection());
command.Parameters.AddWithValue("@name", name);
command.Parameters.AddWithValue("@count", count);
command.Parameters.AddWithValue("@company", company);
command.Parameters.AddWithValue("@type", type);
command.Parameters.AddWithValue("@price", price);
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@country", country);
command.Parameters.AddWithValue("@supplier", supplier);
command.ExecuteNonQuery();
dataBase.CloseConnetction();
UpdateDataGrid();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка! Еще раз проверьте значения в столбцах строки.", "Ошибка", MessageBoxButton.OK);
}
}
Вот биндинги на всякий случай:
<DataGrid FontSize="22" AutoGenerateColumns="False" x:Name="phonesGrid" d:ItemsSource="{d:SampleData ItemCount=10}" Margin="22,114,624,257" Background="WhiteSmoke" Cursor="" Grid.RowSpan="2" >
<DataGrid.Columns >
<DataGridTextColumn Binding="{Binding id}" Header="" FontSize="22" Width="200" />
<DataGridTextColumn Binding="{Binding one_bind}" Header="" FontSize="22" Width="200" />
<DataGridTextColumn Binding="{Binding two_bind}" Header="" FontSize="22" Width="200"/>
<DataGridTextColumn Binding="{Binding tree_bind}" Header="" FontSize="22" Width="200"/>
<DataGridTextColumn Binding="{Binding four_bind}" Header='' IsReadOnly="True" FontSize="22" Width="200" />
</DataGrid.Columns>
</DataGrid>
Ответы (1 шт):
Создайте для каждой таблицы в SQL свои запросы: Delete, Update, Insert...
При выборе таблицы в combobox считывайте название таблицы и передавайте в запрос (имя таблицы, Id строки, данные).
P.S. Для изменения таблицы я бы сделал форму, которая заполнялась данными по двойному клику по строке таблицы, считывал Id, менял значения, удалял, добавлял новые и вызывал запрос в БД. Обновлял грид из БД.