Search code examples
c#sql-serverwpf

How to add/edit/manipulate data in my SQL Server database, if upload several tables to the datagrid the solution is implemented in WPF project in C#


How to add, edit and delete (manipulate) data in my SQL Server database, working via ObservableCollection, if I upload several tables to the datagrid the solution is implemented in the WPF project in C#.

Faced with such a problem, when working with my WPF application in C#, I output data from my SQL Server database via an ObservableCollection, from several tables simultaneously into one datagrid, but I can't interact with the output data in any way. When I output data from one table, I can add new records, edit and delete existing ones.

public partial class МышьАдминистратор : Page
{
    ObservableCollection<Автоматизированное_рабочее_место> ListАРМ;
    ObservableCollection<Мышь> ListМышь;
    public static учетEntities уч;

    public МышьАдминистратор()
    {
        уч = new учетEntities();
        InitializeComponent();
        ListАРМ = new ObservableCollection<Автоматизированное_рабочее_место>();
        ListМышь = new ObservableCollection<Мышь>();
        var queryАРМ = from a in уч.Автоматизированное_рабочее_место orderby a.Код_АРМ select new { a.Код_АРМ, a.Номер_кабинета, a.Инвентарный_номер_Блока, a.Инвентарный_номер_Монитора, a.Инвентарный_номер_Мыши, a.Инвентарный_номер_Клавиатура, a.Инвентарный_номер_МФУ };
       var queryМш = from e in уч.Мышь orderby e.Инвентарный_номер_Мыши select new { e.Инвентарный_номер_Мыши, e.Наименование, e.Тип, e.Код_Обслуживания };
        
        var queryОбсл = from h in уч.Обслуживание orderby h.Код_Обслуживания select new { h.Код_Обслуживания, h.Дата, h.Примечание, h.Стоимость };

        var querysumm = from e in уч.Мышь
                        join a in queryАРМ on e.Инвентарный_номер_Мыши equals a.Инвентарный_номер_Мыши
                        join g in queryКаб on a.Номер_кабинета equals g.Номер_кабинета                             
                        join h in queryОбсл on e.Код_Обслуживания equals h.Код_Обслуживания
                        select new
                        {
                            a.Код_АРМ,
                            e.Инвентарный_номер_Мыши,
                            e.Наименование,
                            e.Тип,
                            e.Код_Обслуживания,
                            g.Номер_кабинета,
                            g.Этаж,
                            h.Дата,
                            h.Примечание,
                            h.Стоимость
                        };
        
        gr.ItemsSource = querysumm.ToList();
    }

    private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyName == "Дата")
            (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
    }
}

I tried to use editing methods as for one table:

private void Add_Click(object sender, RoutedEventArgs e)
{
    int maxID = (from us in уч.Мышь select us.Инвентарный_номер_Мыши).Max();
    Мышь mouse = new Мышь();

    mouse.Инвентарный_номер_Мыши = maxID + 1;
    Enter(mouse.Инвентарный_номер_Мыши);
}

private void Enter(int IDMouse)
{
    Мышь mouse = new Мышь();
    mouse.Инвентарный_номер_Мыши = IDMouse;
    ListМышь.Add(mouse);
    уч.Мышь.Add(mouse);

    gr.ScrollIntoView(mouse);
    gr.SelectedIndex = gr.Items.Count - 1;
    gr.Focus();
    gr.IsReadOnly = false;
}

private void Edit_Click(object sender, RoutedEventArgs e)
{
    gr.IsReadOnly = false;

    if (gr.SelectedItem != null)
    {
        var cell = gr.SelectedCells[0];
        gr.CurrentCell = cell;
    }
    else
    {
        gr.CurrentCell = new DataGridCellInfo (gr.Items[0], gr.Columns[0]);
    }

    gr.BeginEdit();
}

private void Delete_Click(object sender, RoutedEventArgs e)
{
        Мышь mouse = gr.SelectedItem as Мышь;

        if (mouse != null)
        {
            MessageBoxResult result = MessageBox.Show("Удалить Изделие под №" + mouse.Инвентарный_номер_Мыши + " с названием: " + mouse.Наименование, "Предупреждение!", MessageBoxButton.OKCancel);

            if (result == MessageBoxResult.OK)
            {
                уч.Мышь.Remove(mouse);
                gr.SelectedIndex = gr.SelectedIndex == 0 ? 1 : gr.SelectedIndex - 1;
                ListМышь.Remove(mouse);
                уч.SaveChanges();
            }
        }
        else
        {
            MessageBox.Show("Выберите строку для удаления");
        }
}

private void Save_Click(object sender, RoutedEventArgs e)
{
    уч.SaveChanges();
    gr.IsReadOnly = true;
    MessageBox.Show("Данные были успешно сохранены");
}

UPD:
User Paul Maxwell gave me a useful recommendation, but I got the following error:

On INotifyPropertyChanged and "Blocks" in OnPropertyChanged("Blocks") returns the error: Severity Error CS1503 Argument 1: cannot convert from "string" to System.Windows.DependencyPropertyChangedEventArgs"


Solution

  • The answer turned out to be much simpler, because it was necessary to use a different kind of "left join"

    PS: In your case, it can be:

    • INNER JOIN or just JOIN
    • LEFT JOIN
    • RIGHT JOIN
    • FULL JOIN
    • CROSS JOIN