Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
WPF

Обновление таблицы DataGrid после его изменения используя при этом INotifyPropertyChanged

25.06.2022, 14:48. Показов 4619. Ответов 36

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

Обновлял таблицу Data grid при помощи коллекции ObservableCollection, все было норм, пока послед удаления и добавления данных в таблицу не перешел к изменению отдельных колонок. После долгого копания в интернете понял, что эта коллекция вроде как не видит изменения если не использовать INotifyPropertyChanged. Пытался сам все это реализовать, но каждый раз натыкаюсь на множество ошибок. Подскажите пожалуйста в каком именно классе мне его реализовать. Вот ссылка на весь код

http://https://github.com/Delpors/WpfApp2.git

А вот класс где я пытался его реализовать.

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
 
namespace ZarplataSpravki
{
    /// <summary>
    /// Логика взаимодействия для Employees.xaml
    /// </summary>
    public partial class Employees : Page
 
    {
        readonly AppContext appContext;
 
        public string ComboBoxSelInst;
 
        public ObservableCollection<Employee> EmployeeCollection;
 
        public Employees()
        {
            InitializeComponent();
 
            appContext = new AppContext();
 
            EmployeeCollection = new ObservableCollection<Employee>(appContext.Employees.ToList());
            EmploeesDataGrid.ItemsSource = EmployeeCollection;
 
            EmployeeCombobox.ItemsSource = new ObservableCollection<Institut>(appContext.Instituts.ToList());
            EmployeeCombobox.DisplayMemberPath = "Institut_name";
        }
 
        private void Button_CloseEmpPage_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new System.Uri("StartPage.xaml", UriKind.RelativeOrAbsolute));
        }
 
        private void Button_Click_AddEmployee(object sender, RoutedEventArgs e)
        {
            AddEmployee button = new AddEmployee
            {
                WindowStartupLocation = WindowStartupLocation.CenterScreen
            };
 
            button.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            button.ShowDialog();
 
            EmployeeCollection = new ObservableCollection<Employee>(appContext.Employees.ToList());
            EmploeesDataGrid.ItemsSource = EmployeeCollection;
        }
        
        private void Button_Click_EditEmployee(object sender, RoutedEventArgs e)
        {
 
            EditRowEmployeeDB editData = new EditRowEmployeeDB();
            Employee dataGridSelrctedItem = (Employee)EmploeesDataGrid.SelectedItem;
 
            editData.WindowStartupLocation = WindowStartupLocation.CenterScreen;
 
            if (dataGridSelrctedItem != null)
            {
                editData.EditData(dataGridSelrctedItem);
            }
 
            EmployeeCollection=new ObservableCollection<Employee>(appContext.Employees.ToList());
            EmploeesDataGrid.ItemsSource = EmployeeCollection;
        }
 
        private void Button_Click_DelEmployee(object sender, RoutedEventArgs e)
        {
 
            DeleteDataDB deletData = new DeleteDataDB();
            Employee employeeDelete = (Employee)EmploeesDataGrid.SelectedItem;
 
            if (employeeDelete != null)
            {
                deletData.DeleteDataEmployee(employeeDelete.id);
            }
 
            EmployeeCollection = new ObservableCollection<Employee>(appContext.Employees.ToList());
            EmploeesDataGrid.ItemsSource = EmployeeCollection;
 
        }
    }
}
Прошу за код сильно меня не бить
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2022, 14:48
Ответы с готовыми решениями:

Обновление DataGrid после изменения данных в запросе
У меня через SQL создан запрос, и подключен к гриду. Когда я ввожу данные в таблицы которые сформировали даный запрос они не отображаются в...

Как осуществить вывод таблицы в DataGrid и обновление таблицы в БД после закрытия окна программы
Имеется БД в MS Sql с одной таблицей. Как осуществить вывод таблицы в DataGrid(или другой компонент) и обновление таблицы в БД после...

Обновление DataSet после изменения структуры таблицы
Доброго времени суток. В приложении работа с базой данных Access идёт через DataSet. Пришлось добавить новую колонку в таблицу уже после...

36
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
02.07.2022, 11:53  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от limeniye Посмотреть сообщение
Вам нужно это сделать при нажатии на "Сохранить"? Так так и делайте.
то есть сделать так чтоб при нажатии на "Сохранить", выполнялся этот код?

C#
1
2
appContext.ChangeTracker.Entries().ToList().ForEach(p => p.Reload());
EmploeesDataGrid.ItemsSource = appContext.Employees.ToList();
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.07.2022, 11:59
delpors, этот код, если честно, вообще полная трешанина.
Но, если мы на это не будем обращать внимания, то да.

Стоят два цирюльника, разговаривают.
Вы подходите к одному и говорите "передай письмо второму".
Почему бы самому сразу не передать письмо второму, если Вы находитесь там же? Какое отношение к этому письму имеет другой джентльмен? Никакого.
1
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
02.07.2022, 12:08  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Какое отношение к этому письму имеет другой джентльмен?
Дело в том, что без "другого джентельмена" эта гребаная таблица почему-то не обновляется при изменении колонки, при удалении и добавлении - да, можно обойтись без него. А при изменении приходится пользоваться интерфейсом INotifyPropertyChanged. )

Не думал, что самообучение будет таким сложным...
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.07.2022, 13:14
Для начала: сделайте возможность нормального взаимодействия с Вашей БД.
Использовать AppContext, как таковой, напряму нельзя. Он должен быть инкапсулирован.

Пример: https://metanit.com/sharp/articles/mvc/11.php

Отталкиваясь от этого примера я сделал SQLStudentsRepository:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
    public class Student
    {
        /// <summary>
        /// Id пользователя берётся из базы данных
        /// </summary>
        /// <remarks>Если <see cref="Id"/> == null, значит пользователь ещё не добавлен в бд</remarks>
        public int? Id { get; set; }
        public string? Name { get; set; }
        public string? Surname { get; set; }
    }
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
53
54
55
56
57
58
59
60
61
62
    public class SQLStudentsRepository : IRepository<Student>
    {
        private StudentContext db;
 
        public SQLStudentsRepository()
        {
            this.db = new StudentContext();
        }
 
        public IEnumerable<Student> GetStudentList()
        {
            return db.Students;
        }
 
        public Student GetStudent(int id)
        {
            return db.Students.Find(id);
        }
 
        public int Create(Student sudent)
        {
            db.Students.Add(sudent);
            return db.Students.Last().Id;
        }
 
        public void Update(Student sudent)
        {
            db.Entry(sudent).State = EntityState.Modified;
        }
 
        public void Delete(int id)
        {
            Student sudent = db.Students.Find(id);
            if (sudent != null)
                db.Students.Remove(sudent);
        }
 
        public void Save()
        {
            db.SaveChanges();
        }
 
        private bool disposed = false;
 
        public virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    db.Dispose();
                }
            }
            this.disposed = true;
        }
 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }


Далее я сделал очень костыльный подход, но если попробую усложнить, боюсь перегнуть.

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
    public class StudentViewModel : OnNotifyPropertyChanged
    {
        private readonly IRepository<Student> _repository;
 
        private int? _id;
        private string? _name, _surname;
 
        public int? Id { get => _id; set => SetProperty(ref _id, value); }
        public string? Name { get => _name; set => SetProperty(ref _name, value); }
        public string? Surname { get => _surname; set => SetProperty(ref _surname, value); }
 
        public StudentViewModel(IRepository<Student> repository)
        {
            _repository = repository;
        }
 
        protected override void OnPropertyChanged(string? propertyName, object? oldValue, object? newValue) 
        {
            if (propertyName == nameof(Name) || propertyName == nameof(Surname) && Id is not null)
            {
                _repository.Update(new Student { Id = this.Id, Name = this.Name, Surname = this.Surname });
            }
        }
    }
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
    public partial class MainWindow : Window
    {
        private readonly IRepository<Student> studentsRepository = new SQLStudentsRepository();
        public ObservableCollection<StudentViewModel> Students { get; } = new ObservableCollection<StudentViewModel>();
 
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
 
        private void Refresh()
        {
            Students.Clear();
 
            foreach (var item in studentsRepository.GetStudentList())
                Students.Add(new StudentViewModel { Id = item.Id, Name = item.Name, Surname = item.Surname });
        }
 
        private void OnAddClicked(object sender, RoutedEventArgs e)
        {
            var student = new Student { Name = textBoxName.Text, Surname = textBoxSurname.Text };
            var id = studentsRepository.Create(student);
 
            var newStudentViewModel = new StudentViewModel { Id = id, Name = textBoxName.Text, Surname = textBoxSurname.Text };
            Students.Add(newStudentViewModel);
        }
 
        private void OnRemoveClicked(object sender, RoutedEventArgs e)
        {
            StudentViewModel studentViewModel = (StudentViewModel)studentsDataGrid.SelectedItem;
 
            studentsRepository.Delete(studentViewModel.Id);
            Students.Remove(studentViewModel);
        }
 
        private void OnSaveChangedClicked(object sender, RoutedEventArgs e)
        {
            studentsRepository.Save();
        }
    }
Немного пояснений.
Когда я добавил в бд нового студента, я проверяю какой Id ему присвоился и возвращаю его, как результат добавления.
Это очень потоконебезопасно, в реалях же такой подход не используется, ибо если я добавлю одновременно двух студентов -- у меня перепутаются Id-шники, но для теста -- достаточно.

Кастально обновления -- Update. Когда Вы в DataGrid измените Name, или Surname студента, у Вас сработает OnPropertyChanged метод. Тут я сделал костыль и прямо там вызвал метод Update, в реалях -- это неприемлимо и так делать нельзя, но я решил не усложнять.

Добавлено через 6 минут
По хорошему StudentViewModel ничего не должна знать ни о каких репозиториях.
Также есть такая проблема: каждый раз, когда Вы будете создавать объект StudentViewModel, Вам придётся его заполнить какими-то данным, и из-за этого у Вас будет срабатывать метод Update.

Например в этой строке:
C#
1
var newStudentViewModel = new StudentViewModel { Id = id, Name = textBoxName.Text, Surname = textBoxSurname.Text };
Тут я задаю ему, например, Name, а значит у меня сработает метод OnPropertyChanged, из-за чего может сработать метод Update -- а из-за этого может возникнуть ошибка.
2
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
02.07.2022, 13:18  [ТС]
limeniye, Спасибо за развернутый ответ, не думал что тут будут возиться с новичками, попытаюсь разобраться.
0
02.07.2022, 13:24

Не по теме:


обращайтесь

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
02.07.2022, 15:42
Цитата Сообщение от delpors Посмотреть сообщение
Изо всех сил пытаюсь не лезть в Binding, да не нравится он мне, а с этим все корректно обновляется. Или это извращение?
Однозначно - извращение.

1) Основной язык WPF - это XAML.
Вообще, нежелательно работать с UI элементами на Шарпе.
Очень часто это требует значительно больше знаний, опыта и кода.
Начинающим же, вообще, следует забыть про наличие Code Behind и никогда даже просто не открывать файлы "*.xaml.cs".

2) Основной способ задания значений свойствам UI элементов - это установка них привязки (Binding) по которой они сами будут получать значения из свойств источников.
По сути, если вам не нужны привязки, то вам не нужен и WPF - используйте Формы.

3)Само Решение с GUI на WPF практически всегда строится по паттерну MVVM. Решение построенное иначе с вероятностью 99.9% будет горой диких костылей, которая может развалиться "от любого чиха".
2
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
02.07.2022, 20:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
которая может развалиться "от любого чиха".
В принципе с этим я сейчас и столкнулся. Хорошо что я дальше не пошел, решил пока полностью во всем не разберусь не идти дальше по коду, последнее предложение limeniye, очень помогло. Теперь пытаюсь все перестроить, надеюсь разберусь.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.07.2022, 20:37
Цитата Сообщение от delpors Посмотреть сообщение
последнее предложение limeniye, очень помогло

Не по теме:


Это не MVVM, лишь его подобие.

1
4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
02.07.2022, 20:38  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Это не MVVM, лишь его подобие.
Для начала и этого хватит, переделать его потом будет не тяжело
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
03.07.2022, 01:42
delpors, в там же разе можно было просто делать invalidate и не надо визиблы всякие менять. Но это точно не mvvm, хотя некоторые и там так же делают иногда.
0
 Аватар для Andrey-MSK
3375 / 2261 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
04.07.2022, 15:48
Цитата Сообщение от delpors Посмотреть сообщение
не перешел к изменению отдельных колонок
Что бы отображались изменения в полях коллекции, ваш тип Student должен поддерживать INPC - вот и весь ответ...
ObservableCollection<T> поддерживает оповещения только для изменения коллекции (Add, Remove, Clear).
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.07.2022, 16:13
Andrey-MSK, Что-то Вы намудрили, по-моему. Разве в коллекции поля́?
0
 Аватар для Andrey-MSK
3375 / 2261 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
04.07.2022, 16:23
Цитата Сообщение от limeniye Посмотреть сообщение
Разве в коллекции поля́?
Ну я по аналогии с БД назвал, ведь коллекция -> таблица, объект в коллекции -> запись, поле объекта в коллекции -> поле записи

Добавлено через 3 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
поле объекта в коллекции
Пардон - свойство
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.07.2022, 16:44
Andrey-MSK, сейчас Вы сами запутались
Это не то и не другое.

Сам сформулировать боюсь, вдруг неправильно.

Возможно подскажет kolorotur.
Из личного интереса — буду благодарен.

Дискуссия началась тут Обновление таблицы DataGrid после его изменения используя при этом INotifyPropertyChanged
0
 Аватар для Andrey-MSK
3375 / 2261 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
12.07.2022, 17:12
delpors, Как вариант (чёт я забыл про этот способ совсем), если не хотите в базовые классы включать INPC, можно делать вот так
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
private async void ChangeForemanExecuted(object obj)
{
    // Получаем индекс элемента коллекции, который будем изменять
    int index = ONZLists.IndexOf(SelectedONZ);
    ONZRenameForemanDialogVM vm = new ONZRenameForemanDialogVM(_currentEObject, SelectedONZ.Foreman);
 
    WindowService.ShowDialog(vm);
 
    if (vm.DialogResult == true)
    {
        try
        {
            await MainDA.ONZDataDA.UpdateONZForemanAsync(SelectedONZ.ONZDate, SelectedONZ.Foreman, vm.NewForeman, _currentEObject);
            
            // Создаём по этому индексу новый объект элемента коллекции
            ONZLists[index] = new ONZList
            {
                ONZDate = SelectedONZ.ONZDate,
                Foreman = vm.NewForeman,
                TotalLabor = SelectedONZ.TotalLabor
            };
            
            // Ставим SelectedItem на изменённый элемент коллекции
            SelectedONZ = ONZLists[index];
        }
        catch (Exception ex)
        {
            WindowService.ShowErrorMessage(ex.ToString(), "Ошибка замены данных");
        }
    }
}
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
14.07.2022, 12:04
должно быть примерно как то так, если уж вы не используете MVVM не нужно пересоздавать ObservableCollection она сама уведомляет если что то добавилось или удалилось.
AddEmployee
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
 
namespace ZarplataSpravki
{
    /// <summary>
    /// Логика взаимодействия для AddEmployee.xaml
    /// </summary>
    public partial class AddEmployee : Window
    {
        readonly AppContext appContext = new AppContext();
 
 
        Employee addedEmployee;
        
 
        public AddEmployee()
        {
            InitializeComponent();
 
            AddEmployeeCombobox.ItemsSource = new ObservableCollection<Institut>(appContext.Instituts.ToList());
            AddEmployeeCombobox.DisplayMemberPath = "Institut_name";
        }
 
        public static Employee employeeAdded(WindowStartupLocation? startupLocation = null)
        {
            AddEmployee addEmployee = new AddEmployee();
            if (startupLocation != null)
                addEmployee.WindowStartupLocation = startupLocation.Value;
            addEmployee.ShowDialog();
            return addEmployee.addedEmployee;
        }
 
        public Employee CreateEmployee()
        {
            Employee employee;
          Institut  instSelEmployee = appContext.Instituts.Find(((Institut)AddEmployeeCombobox.SelectedItem).id);
 
            employee = new Employee
            {
                FIO = _FIO.Text.Trim(),
 
                Post = _Post.Text.Trim(),
                
                Oklad = Convert.ToInt32(_Oklad.Text),
 
                Neoblag_Summa = Convert.ToInt32(_Neoblag_Summa.Text)
            };
 
            employee = new Employee(employee.FIO, employee.Post, employee.Oklad, employee.Neoblag_Summa, instSelEmployee);     
            return employee;
        }
 
        private void Click_AddEmployee(object sender, RoutedEventArgs e)
        {
            if (AddEmployeeCombobox.SelectedItem != null)
            {
                try
                {
                   var employee = CreateEmployee();
 
                    appContext.Employees.Add(employee);
                    appContext.SaveChanges();
                    addedEmployee = employee;
                    Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("Введены некорректные данные", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            else
            {
                MessageBox.Show("Выберите учреждение где работает сотрудник", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
 
        private void Click_CloseEmployee(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
}


Employees
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
 
namespace ZarplataSpravki
{
    /// <summary>
    /// Логика взаимодействия для Employees.xaml
    /// </summary>
    public partial class Employees : Page
 
    {
        readonly AppContext appContext;
 
        public Employee employee;
        public string ComboBoxSelInst;
        public ObservableCollection<Employee> EmployeeCollection { get; } = new ObservableCollection<Employee>();
 
        public Employees()
        {
            InitializeComponent();
 
            appContext = new AppContext();
            DataContext = this;
            foreach (Employee emp in appContext.Employees)
            { EmployeeCollection.Add(emp); }
 
            EmployeeCombobox.ItemsSource = new ObservableCollection<Institut>(appContext.Instituts.ToList());
            EmployeeCombobox.DisplayMemberPath = "Institut_name";
        }
 
        private void Button_CloseEmpPage_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new System.Uri("StartPage.xaml", UriKind.RelativeOrAbsolute));
        }
 
        private void Button_Click_AddEmployee(object sender, RoutedEventArgs e)
        {
            var employee = AddEmployee.employeeAdded(WindowStartupLocation.CenterScreen);
 
            EmployeeCollection.Add(employee);
        }
 
        private void Button_Click_EditEmployee(object sender, RoutedEventArgs e)
        {
 
            //получение значения выделенной строки
            EditRowEmployeeDB editData = new EditRowEmployeeDB();
            Employee dataGridSelrctedItem = (Employee)EmploeesDataGrid.SelectedItem;
 
            editData.WindowStartupLocation = WindowStartupLocation.CenterScreen;
 
            if (dataGridSelrctedItem != null)
            {
                editData.EditData(dataGridSelrctedItem);
            }
 
            ///  EmployeeCollection=new ObservableCollection<Employee>(appContext.Employees.ToList());
        }
 
        private void Button_Click_DelEmployee(object sender, RoutedEventArgs e)
        {
 
            //получение значения выделенной строки
            DeleteDataDB deletData = new DeleteDataDB();
            Employee employeeDelete = (Employee)EmploeesDataGrid.SelectedItem;
 
            if (employeeDelete != null)
            {
                if (deletData.DeleteDataEmployee(employeeDelete.id))
                    EmployeeCollection.Remove(employeeDelete);
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2022, 12:04

DataGrid+ObjectDataProvider+DataTable после изменения источника обновить DataGrid
Окно с DataGrid 1. В ресурсах окна объявлен Instance датапровайдера с методом, возвращающим DefaultView для таблицы...

DataGrid. Как его заполнить в этом случае?
Такая вот ситуевина, есть датагрид, туда хочу затолкать разные типы полей, начал с картинки. В датагрид нужно в ячейку положить...

не могу отобразить изменения в DataGrid на C# используя старые навыки
Пытаюсь перейти из VB в C#. В VB при заполнении comboBox обычно в ItemData складывал ID и потом их использовал для фильтрации в Recordset и...

Обновление dataGrid сразу после добавления/удаления записи, а не после перезапуска приложения
Здравствуйте, написал в с# процедуры на добавление и удаления данных, при нажатии соответственных кнопок, всё работает, но проблема в том...

Быстрое обновление DataGrid из большой таблицы (+++)
Есть БД на MS SQL Server 2000 и таблицы (порядка 60 тыс. записей) Так же есть форма, где есть Grid, который отображает данные,...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru