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"
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: