4 / 4 / 0
Регистрация: 14.05.2013
Сообщений: 52
WPF

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

25.06.2022, 14:48. Показов 4720. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,721
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,721
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,721
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru