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

Увеличить скорость фильтрации DataGrid

24.10.2023, 23:23. Показов 2285. Ответов 43
Метки wpf (Все метки)

Студворк — интернет-сервис помощи студентам
Перейти в окно "ManagerIndexesView".
При перемещении фокуса по строкам DataGrid "IndexesView" должны фильтроваться остальные таблицы.
Проблема: таблицы фильтруются с задержкой.
Приблизительно, задержка равна 0,5-1 секунд.

Вопрос: как ускорить работу фильтрации?
Как это сделать в минимальном виде Framework
Без погружения в детали MVVM и другие правила оформления кода.


Логика работы в окне "Управление коэффициентами":
- пользователь выбирает запись в таблице **IndexesView**;
- пользователь выбирает запись в в таблице **ProvidersView**;
- пользователь нажимает кнопку в строке таблицы **ProvidersView**;
- приложение переносит запись из таблицы **ProvidersView** в таблицу "IndexesProvidersView".

На картинке показано как для **IndexesProvidersView** с id = 4 набраны поставщики с id =11-20.
Поставщики с id =11-20 удалены из таблицы **ProvidersView**


Планы:
- Таблица **ProvidersView**: добавить кнопки в строки `DataGrid`;
- Логика кнопки: Item переместить из `Providers` перемещается в `IndexesProviders`.
- Таблица **IndexesProviders**: добавить кнопки в строки `DataGrid`;
- Логика кнопки: Item переместить из `IndexesProviders` перемещается в `Providers`.

Собрал решение на сколько хватает опыта.
При рассмотрении прошу делать поправку на мою неопытность...
Проект: https://github.com/jhon65496/WpfApp1

Код привожу частично.



Код
DataContextApp.cs
Кликните здесь для просмотра всего текста
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 public class DataContextApp
    {
        public DataContextApp()
        {
            GenerateDataСalculationIndex();
            GenerateDataProviders();            
            GenerateDataIndexProvider3();
        }
 
 
        private ObservableCollection<IndexCalculation> calculationIndexes;
 
        public ObservableCollection<IndexCalculation> СalculationIndexes
        {
            get { return calculationIndexes; }
            set { calculationIndexes = value; }
        }
 
 
        private ObservableCollection<Provider> providers;
 
        public ObservableCollection<Provider> Providers
        {
            get { return providers; }
            set { providers = value; }
        }
 
 
        private ObservableCollection<IndexProvider> indexProviders;
 
        public ObservableCollection<IndexProvider> IndexProviders
        {
            get { return indexProviders; }
            set { indexProviders = value; }
        }
 
        private ObservableCollection<IndexProviderView> indexProvidersJoinView;
 
        public ObservableCollection<IndexProviderView> IndexProvidersJoinView
        {
            get { return indexProvidersJoinView; }
            set { indexProvidersJoinView = value; }
        }
 
        
 
        // ---- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
        public void GenerateDataСalculationIndex()
        {
            var calculationIndexes = new ObservableCollection<IndexCalculation>();
            for (int i = 1; i < 11; i++)
            {
                var indexCalculation = new IndexCalculation()
                {
                    Id = i,
                    Name = $"NameIndex-{i}",
                    Description = $"DescriptionIndex-{i}"
                };
                calculationIndexes.Add(indexCalculation);
            }
 
            СalculationIndexes = calculationIndexes;
        }
 
 
        public void GenerateDataProviders()
        {
            Providers = new ObservableCollection<Provider>();
            for (int i = 1; i < 101; i++)
            {
                var provider = new Provider()
                {
                    Id = i,
                    Name = $"NameProvider-{i}",
                    Description = $"DescriptionProvider-{i}"
                };
                Providers.Add(provider);
            }
        }
 
 
        public void GenerateDataIndexProvider3()
        {
            IndexProviders = new ObservableCollection<IndexProvider>();
 
            int idIndexProvider = 1;
            int indexCurrentProvider = 1;
 
            for (int ii = 3; ii < 11; ii++)     // Index
            {
                int step = 10;
                int indexFirstProvider = indexCurrentProvider;
                int indeLastProvider = indexFirstProvider + step;
 
                for (int ip = indexFirstProvider; ip < indeLastProvider; ip++) // Provider
                {
                    // idIndexProvider         
                    var indexProveder = new IndexProvider()
                    {
                        Id = idIndexProvider,
                        IdIndex = ii,
                        IdProvider = ip
                    };
                    IndexProviders.Add(indexProveder);
                    idIndexProvider++;
                }
                indexCurrentProvider = indeLastProvider++;
            }
           
            CreateView2();//
        }
 
        public void CreateView2()
        {
            var IndexProviderViews = IndexProviders.Join(Providers,
                 ip => ip.IdProvider, p => p.Id,
                (ip, p) => new IndexProviderView
                {
                    Id = ip.Id,
                    IdIndex = ip.IdIndex,
                    IdProvider = ip.IdProvider,                   
 
                    NameProvider = p.Name
                }).ToList();
 
            IndexProvidersJoinView = new ObservableCollection<IndexProviderView>(IndexProviderViews);
        }
    }




Models
IndexCalculation
Provider
IndexProvider
IndexProviderView
MainMenuItemMainWindow

Кликните здесь для просмотра всего текста
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
**IndexCalculation**
```cs
public class IndexCalculation
{
    public int Id { get; set; }
 
    public int Sort { get; set; }
 
    public string Name { get; set; }
 
    public string Alias { get; set; }
    
    public int Value { get; set; }
    
    public int CorrectionRegion { get; set; }
    
    public string Description { get; set; }
 
    public List<Provider> Providers { get; set; }
}
```
 
**IndexProvider**
```cs
public class IndexProvider
{
    public int Id { get; set; }
    public int IdIndex { get; set; }
    public int IdProvider { get; set; }
}
```
 
**IndexProviderView**
```cs
public class IndexProviderView
{
    public int Id { get; set; }
    public int IdIndex { get; set; }
    public int IdProvider { get; set; }
 
    public int Sort { get; set; }
 
    public string NameProvider { get; set; }        
}
```
 
**MainMenuItemMainWindow**
```cs
internal class MainMenuItemMainWindow
{
    public int Id { get; set; }
 
    public int Sort { get; set; }
 
    public string Name { get; set; }
    
    public string Alias { get; set; }
 
    public string Description { get; set; }
 
    public UserControl Control { get; set; }
}
```
 
**Provider**
```cs
public class Provider
{
    public int Id { get; set; }
 
    public int Sort { get; set; }
 
    public string Name { get; set; }
 
    public string Alias { get; set; }
    
    public int Value { get; set; }
    
    public int CorrectionRegion { get; set; }
    
    public string Description { get; set; }
}
```


App.xaml.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class App : Application
{
    public App()
    {
    }
 
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        
        AppManager appManager = new AppManager();
    }
}




AppManager
Кликните здесь для просмотра всего текста
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
public class AppManager
{
    MainWindowViewModel mainWindowViewModel;
    
    public IndexesViewModel indexesViewModel;
    public ProvidersViewModel providersViewModel;
    public IndexesProvidersViewModel indexesProvidersViewModel;
    
    public ManagerIndexesViewModel managerIndexesViewModel;
    // public ManagerIndexesViewModel2 ManagerIndexesViewModel2;
 
    DataContextApp DataContextApp;
    public AppManager()
    {
        mainWindowViewModel = new MainWindowViewModel(this);
        MainWindow mainWindow =new MainWindow();
        mainWindow.DataContext = mainWindowViewModel;
        mainWindow.Show();
 
        // managerIndexesViewModel = new ManagerIndexesViewModel();
 
        DataContextApp = new DataContextApp();
    }
 
 
    private string testProp;
 
    public string TestProp
    {
        get { return testProp; }
        set 
        { 
            testProp = value;
            Debug.WriteLine("*** **** **** *** *** *** *** ***");
            Debug.WriteLine("AppManager -- TestProp - работает");
            Debug.WriteLine($"AppManager получил соощение в свойство TestProp -- {TestProp}");
        }
    }
 
 
    public void SwitchView(string nameView)
    {
        switch (nameView)
        {
            case "ManagerIndexes":
                ManagerIndexesViewModel ManagerIndexesViewModel = new ManagerIndexesViewModel(DataContextApp);
                
 
                mainWindowViewModel.CurrentView = ManagerIndexesViewModel;
                
                break;
 
            case "Indexes":
                IndexesViewModel indexesViewModel = new IndexesViewModel(DataContextApp);
                
 
                mainWindowViewModel.CurrentView = indexesViewModel;
                break;
 
            case "Provider":
                ProvidersViewModel providersViewModel = new ProvidersViewModel(DataContextApp);
                mainWindowViewModel.CurrentView = providersViewModel;
                break;
            
            // default: Debug.WriteLine(" ");
        }
 
 
    }
 
}


MainWindowViewModel
Кликните здесь для просмотра всего текста
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
internal class MainWindowViewModel : BaseVM
{
    AppManager appManager;
    
    public MainWindowViewModel(AppManager appManager)
    {
        this.appManager = appManager;
        
        LoadItemMainMenu();
    }
 
    //public MainWindowViewModel() : this(new AppManager())
    //{
 
    //}
 
 
    #region Title
    private string title = "App `WpfApp1`. Prop title";
    
    public string Title 
    {
        get { return title; }
        set { title = value; }
    }
    #endregion
 
    #region mainMenuItems        
    private ObservableCollection<MainMenuItemMainWindow> mainMenuItems;
 
    public ObservableCollection<MainMenuItemMainWindow> MainMenuItems
    {
        get { return mainMenuItems; }
        set
        {
            mainMenuItems = value;
            RaisePropertyChanged(nameof(MainMenuItemMainWindow));
        }
    }
    #endregion
 
    #region SelectedItem
    private MainMenuItemMainWindow selectedMainMenuItem;
 
    public MainMenuItemMainWindow SelectedMainMenuItem
    {
        get { return selectedMainMenuItem; }
        set 
        {                 
            selectedMainMenuItem = value;
            Debug.WriteLine($"MainWindowViewModel -- selectedMainMenuItem.Alias -- {selectedMainMenuItem.Alias}");
 
            TitleDetail = selectedMainMenuItem.Name;
            appManager.SwitchView(selectedMainMenuItem.Alias);
 
            RaisePropertyChanged(nameof(CurrentView));
        }
    }
    #endregion
 
 
    private BaseVM currentView;
    public BaseVM CurrentView
    {
        get { return currentView; }
        set
        {
            currentView = value;
            RaisePropertyChanged(nameof(CurrentView));
        }
    }
 
    #region TitleDetail
    private string titleDetail = "TitleDetail";
 
    public string TitleDetail
    {
        get { return titleDetail; }
        set 
        { 
            titleDetail = value;
            Debug.WriteLine($"titleDetail -- {titleDetail}");
            RaisePropertyChanged(nameof(TitleDetail));
        }
    }
    #endregion
    
 
 
    public void LoadItemMainMenu()
    {
        mainMenuItems = new ObservableCollection<MainMenuItemMainWindow>()
        {
            new MainMenuItemMainWindow(){ Name = "Управление коэффициентами", Alias ="ManagerIndexes" },
            new MainMenuItemMainWindow(){ Name = "Коэффициенты", Alias ="Indexes"  },
            new MainMenuItemMainWindow(){ Name = "Поставщки", Alias ="Provider"  }
        };
        
        // appManager.TestProp = "MainWindowViewModel - выполнен метод LoadItemenu";
    }
 
}
Миниатюры
Увеличить скорость фильтрации DataGrid   Увеличить скорость фильтрации DataGrid   Увеличить скорость фильтрации DataGrid  

Увеличить скорость фильтрации DataGrid  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2023, 23:23
Ответы с готовыми решениями:

Применение нескольких checkbox к datagrid для фильтрации данных
Есть 2 чекбокса, чекбокс1 = Имя1, чекбокс2 = Имя1. В датагрид данные идут и бд. Если я нажимаю на чекбокс1, то в датагрид фильтруется и...

Разные параметры для поиска, сортировки и фильтрации DataGrid
Здравствуйте! Мне требуется, в зависимости от выбора в RadioButton, вывести разные данные в DataGrid. С этим я справилась, но так же мне...

Как увеличить скорость отображения данных
Данные вывожу в datagrid, datagrid привязан к List&lt;class&gt;. В datagrid имеется 20 столбцов и нужно вывести 1000 строк, на то чтоб появились...

43
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 14:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чистка муссора и добавление нормальных реализаций команд и базовой VM. Рефакторинг имён. Перевод на .Net6.
.NET Framework можно оставить?
https://www.cyberforum.ru/post17088868.html

Добавлено через 22 минуты
Элд Хасп,
Если для вас ".NET Framework" не составит сильных неудобств...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 14:17
C#
1
2
3
            SubjectsView cView = new SubjectsView();
            cView.DataContext = subjectsViewModel;
            SubjectsView = subjectsViewModel;
dev3214, на уровнях ниже View ни при каких условиях, обстоятельствах НЕ ДОПУСКАЕТСЯ категорически использование, обращение к UI Элементам!!!

Добавлено через 2 минуты
Цитата Сообщение от dev3214 Посмотреть сообщение
Если для вас ".NET Framework" не составит сильных неудобств...
Составляет. Мои классы, которые добавил вам в проект, созданы под .Net.
Их можно переделать под Framework, но нужно на это тратить время.
Если для вас это принципиально, то переделайте их сами.

Добавлено через 35 секунд
Чем, вообще, вызвано использование Framework?
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 14:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Составляет. Мои классы, которые добавил вам в проект, созданы под .Net.
Их можно переделать под Framework, но нужно на это тратить время.
Если для вас это принципиально, то переделайте их сами.
Чем, вообще, вызвано использование Framework?
Да. Я уже заметил... Папка Common
Ок...



Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чем, вообще, вызвано использование Framework?
Нуу... NEt6 я пока к нему не привык...
Мозги скрипят...
NEt Framework как-то понятнее..

Цитата Сообщение от Элд Хасп Посмотреть сообщение
ГШ Элементам!!!
Что такое "ГШ Элементам"?
Обращение(создание) к VIew?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 14:40
dev3214, собственно сама реализация фильтрации:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Application x:Class="FacultyWpfApp1ButtonStudentsStudents.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:FacultyWpfApp1ButtonStudentsStudents"
             xmlns:vms="clr-namespace:FacultyWpfApp1ButtonStudents.ViewModels"
             StartupUri="/MainWindow.xaml">
    <Application.Resources>
        <vms:MainWindowViewModel x:Key="mainVM"/>
        <CollectionViewSource x:Key="students"
                              Source="{Binding Students, Source={StaticResource mainVM}}"/>
        <CollectionViewSource x:Key="subjects"
                              Source="{Binding Subjects, Source={StaticResource mainVM}}"/>
    </Application.Resources>
</Application>
XML
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
<Window x:Class="FacultyWpfApp1ButtonStudents.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FacultyWpfApp1ButtonStudents"
        xmlns:vm ="clr-namespace:FacultyWpfApp1ButtonStudents.ViewModels"
        xmlns:v="clr-namespace:FacultyWpfApp1ButtonStudents.Views"        
        mc:Ignorable="d"
        Title="MainWindow"
        Height="800" Width="900"
        DataContext="{DynamicResource mainVM}">
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:SubjectsViewModel}">
            <v:SubjectsView DataContext="{Binding}"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:SubjectsStudentsJoinViewModel}">
            <v:SubjectsStudentsJoinView DataContext="{Binding}"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:StudentsViewModel}">
            <v:StudentsView DataContext="{Binding}"/>
        </DataTemplate>
    </Window.Resources>
 
    <Grid>
        <GroupBox Grid.Column="0" Header="Faculty Management">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="350" MinWidth="200"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
 
                <!-- GroupBox - Subjects, SubjectsStudentsView  -->
                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition Height="auto"/>
                        <RowDefinition />
                    </Grid.RowDefinitions>
 
                    <GroupBox Grid.Row="0" Header="SubjectsView">
                        <!--<ContentControl Content="{Binding SubjectsView}"/>-->
                        <v:SubjectsView/>
                    </GroupBox>
                    <!--  GridSplitter Горзонтальный -->
                    <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" Height="3"/>
                    <!--  GridSplitter Горзонтальный -->
                    <GroupBox Grid.Row="2" Header="SubjectsStudentsJoinView">
                        <ContentControl Content="{Binding SubjectsStudentsJoinView}"/>
                    </GroupBox>
 
                </Grid>
 
                <GroupBox Grid.Column="1" Header="Students">
                    <!--<ContentControl Content="{Binding StudentsView}"/>-->
                    <v:StudentsView/>
                </GroupBox>
                <GridSplitter Grid.Column="0" HorizontalAlignment="Right" Width="3"/>
            </Grid>
        </GroupBox>
    </Grid>
</Window>
XML
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
<UserControl x:Class="FacultyWpfApp1ButtonStudents.Views.SubjectsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:FacultyWpfApp1ButtonStudents.Views"
             mc:Ignorable="d"              
             d:DesignHeight="450" d:DesignWidth="400"
             xmlns:vm ="clr-namespace:FacultyWpfApp1ButtonStudents.ViewModels">
 
    <!--<DockPanel>-->
    <DataGrid Grid.Row="1" 
                    ItemsSource="{Binding Source={StaticResource subjects}}"                                              
                    SelectedItem="{Binding SelectedSubject}"                          
                    SelectedIndex="2"
                    x:Name="MainDataGrid"                                         
                    AutoGenerateColumns="False"                                  
                    CanUserAddRows="True"
                    GridLinesVisibility="Vertical"                                  
                    VerticalGridLinesBrush="DarkGray"
                    AlternatingRowBackground="LightGray"
                    SelectionMode="Single"
                    SelectionChanged="OnSelectedSubjectChanged">
        <DataGrid.Columns>
            <DataGridTextColumn Header="IdSubject" Binding="{Binding Id}" Width="Auto"/>
            <DataGridTextColumn Header="NameSubject" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Description" Binding="{Binding Description}"  Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
    <!--</DockPanel>-->
</UserControl>
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
using FacultyWpfApp1ButtonStudents.Models;
using FacultyWpfApp1ButtonStudents.ViewModels;
using System.ComponentModel;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Data;
 
namespace FacultyWpfApp1ButtonStudents.Views
{
    /// <summary>
    /// Логика взаимодействия для SubjectsView.xaml
    /// </summary>
    public partial class SubjectsView : UserControl
    {
        private readonly ICollectionView students;
        private readonly MainWindowViewModel mainVM;
        public SubjectsView()
        {
            mainVM = ((MainWindowViewModel)FindResource(nameof(mainVM)));
            students = ((CollectionViewSource)FindResource(nameof(students))).View;
 
            InitializeComponent();
        }
 
        private void OnSelectedSubjectChanged(object sender, SelectionChangedEventArgs e)
        {
            if (mainVM.SelectedSubject is not Subject subject)
            {
                students.Filter = null;
            }
            else
            {
                students.Filter = obj =>
                        obj is Student student &&
                        student.Subjects.Any(sbj => sbj.Id == subject.Id);
            }
        }
    }
}
XML
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
<UserControl x:Class="FacultyWpfApp1ButtonStudents.Views.StudentsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:FacultyWpfApp1ButtonStudents.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <!--<DockPanel>-->
    <DataGrid Grid.Row="1" 
                    ItemsSource="{Binding Source={StaticResource students}}"                                              
                    SelectedItem="{Binding SelectedStudent}"                          
                    SelectedIndex="2"
                    x:Name="MainDataGrid"                                         
                    AutoGenerateColumns="False"                                  
                    CanUserAddRows="True"
                    GridLinesVisibility="Vertical"                                  
                    VerticalGridLinesBrush="DarkGray"
                    AlternatingRowBackground="LightGray">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="AddInSubjectsStudentsJoinView" HorizontalAlignment="Center" VerticalAlignment="Top" Padding="5,0"
                                    Background="Transparent" 
                                    BorderThickness="0" 
                                    Foreground="Green"
                                    FontWeight="Bold"
                                    Command=""
                                    CommandParameter=""/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="IdStudent" Binding="{Binding Id}" Width="Auto"/>
            <DataGridTextColumn Header="NameStudent" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Description" Binding="{Binding Description}"  Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
    <!--</DockPanel>-->
</UserControl>
Фиксацию отправил.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 14:44
Цитата Сообщение от dev3214 Посмотреть сообщение
Что такое "ГШ Элементам"?


Не в той раскладке. Это UI элементы.

Добавлено через 2 минуты
Цитата Сообщение от dev3214 Посмотреть сообщение
Нуу... NEt6 я пока к нему не привык...
Мозги скрипят...
NEt Framework как-то понятнее..
Вощё не понял о чём вы...

Код Framework за редчайшими исключениями будет так же компилироваться и работать в .Net6.
В .Net6 есть свои дополнительные приятные плюшки, но если не хотите их использовать - не используйте.
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 14:50  [ТС]
Элд Хасп,
Я прошу прощения...
Но как Visual Studio получить вашу ветку?
Если не сложно, можно картинку?


Не по теме:


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сообщение от dev3214
Что такое "ГШ Элементам"?
Не в той раскладке. Это UI элементы.
А я вспотел...
Думаю и так мозги кипят, тут ещё какой-то зверь...

0
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 15:04  [ТС]
Элд Хасп,
Кажись нашёл...
Я выполнил шаги как на картинке...
У меня последняя версия ветки получается?
Миниатюры
Увеличить скорость фильтрации DataGrid  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 15:07
Цитата Сообщение от dev3214 Посмотреть сообщение
Но как Visual Studio получить вашу ветку?
Если не сложно, можно картинку?
1) В правом нижнем углу раскрываем список ветвей;
2) Если нужной ветви нет - переходим на вкладку "Удалённые";
3) На нужной ветке - двойной клик.





1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 15:17  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сообщение от dev3214
Но как Visual Studio получить вашу ветку?
Если не сложно, можно картинку?
1) В правом нижнем углу раскрываем список ветвей;
2) Если нужной ветви нет - переходим на вкладку "Удалённые";
3) На нужной ветке - двойной клик.
Сделал...

Сделал копию ветки: eldhasp
Назвал копию: eldhaspJhon65496_1.

Обнаружил, что в ветке eldhasp нету последнего комита.
Вернулся в ветку: eldhasp.

Сделал действия как на картинке.
Правда не уверен, что нажал "Извлечь"(вроде "извлечь")
Результат: последнего комита нету.

Вопрос: Как получить последний коммит?
Миниатюры
Увеличить скорость фильтрации DataGrid  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 15:20
Цитата Сообщение от dev3214 Посмотреть сообщение
Кажись нашёл...
Прекрасно.

Цитата Сообщение от dev3214 Посмотреть сообщение
У меня последняя версия ветки получается?
Автоматически всегда загружается последняя фиксация.
Для просмотра предыдущих надо перейти к окну просмотра фиксаций:
1) Раскрываем список фиксаций и выбираем просмотреть фиксации.
2) По двойному клику на нужной фиксации раскроется инструмент сравнения фиксация. В нём можно выбрать любое изменение и сравнить его с предыдущим состоянием.
3) Так же, из контекстного меню фиксации (ПКМ) можно откатить к любой фиксации с сохранением или удалением изменений.





1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 15:24
Цитата Сообщение от dev3214 Посмотреть сообщение
Как получить последний коммит?
У вас не все получены коммиты.
Посмотрите на скрине - висит "1" во входящих.

В списке фиксаций есть пункт "Получить" - кликните его.

Добавлено через 1 минуту
Цитата Сообщение от dev3214 Посмотреть сообщение
Правда не уверен, что нажал "Извлечь"(вроде "извлечь")
"Извлечь" просто покажет есть или нет ещё фиксации, их историю.
Для их получения нужно "Получить".
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 16:09  [ТС]
Элд Хасп,

Резюмирую.
Чтобы убедится что правильно понял....

Получить список коммитов(фиксаций) с ГитХаб
Вариант-1
Перейти в Ветви -> Выбрать ветвь. ПКМ. -> Извлечь.
Результат: получаем список коммитов(фиксаций) с ГитХаб.

Вариант-2
Перейти в VS справа внизу -> Выбрать ветвь
Перейти в VS справа внизу -> Список фиксаций -> Извлечь.
Результат: получаем список коммитов(фиксаций) с ГитХаб.




Получить код с изменениями с ГитХаб
Перейти в Ветви -> Выбрать ветвь. ПКМ. -> Получить.
Результат: получаем код с изменениями с ГитХаб.



Правильно понял?



Что такое принесение | вытягивание?
В разделе Входящие....
Миниатюры
Увеличить скорость фильтрации DataGrid  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 16:47
Цитата Сообщение от dev3214 Посмотреть сообщение
Резюмирую.
Чтобы убедится что правильно понял....
Да. На практике всегда используется "Получить". Очень редко когда бывает нужно "Извлечь".


Сами пункты меняю задублированы во множестве мест.
То что сразу в голову пришло:
1) Меню снизу справа в строке состояния;
2) Пункт Git основного меню Студии;
3) Панель обозревания Git - обычно справа, там же где Обозреватели Решения, Свойств;
4) В Окне просмотра фиксаций в нескольких местах.

Цитата Сообщение от dev3214 Посмотреть сообщение
Что такое принесение | вытягивание?
Издержки перевода "не русскими буржуями" как я думаю. В одном месте так переводят, в другом по другому.
Принесение - это Извлечение.
Вытягивание - Получение.
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 17:25  [ТС]
Элд Хасп,
Вроде работает... Летает...
Спасибо...

Можно ещё один нюанс доработать?... см. картинку..
Миниатюры
Увеличить скорость фильтрации DataGrid  
0
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 17:26  [ТС]
Элд Хасп,
Обновил картинку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 18:46
Цитата Сообщение от dev3214 Посмотреть сообщение
Можно ещё один нюанс доработать?... см. картинку..
XML
7
8
9
10
11
12
13
14
15
    <Application.Resources>
        <vms:MainWindowViewModel x:Key="mainVM"/>
        <CollectionViewSource x:Key="subjectStudents"
                              Source="{Binding Students, Source={StaticResource mainVM}}"/>
        <CollectionViewSource x:Key="noSubjectStudents"
                              Source="{Binding Students, Source={StaticResource mainVM}}"/>
        <CollectionViewSource x:Key="subjects"
                              Source="{Binding Subjects, Source={StaticResource mainVM}}"/>
    </Application.Resources>
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
using FacultyWpfApp1ButtonStudents.Models;
using FacultyWpfApp1ButtonStudents.ViewModels;
using System.ComponentModel;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Data;
 
namespace FacultyWpfApp1ButtonStudents.Views
{
    /// <summary>
    /// Логика взаимодействия для SubjectsView.xaml
    /// </summary>
    public partial class SubjectsView : UserControl
    {
        private readonly ICollectionView subjectStudents;
        private readonly ICollectionView noSubjectStudents;
        private readonly MainWindowViewModel mainVM;
        public SubjectsView()
        {
            mainVM = ((MainWindowViewModel)FindResource(nameof(mainVM)));
            subjectStudents = ((CollectionViewSource)FindResource(nameof(subjectStudents))).View;
            noSubjectStudents = ((CollectionViewSource)FindResource(nameof(noSubjectStudents))).View;
 
            InitializeComponent();
        }
 
        private void OnSelectedSubjectChanged(object sender, SelectionChangedEventArgs e)
        {
            if (mainVM.SelectedSubject is not Subject subject)
            {
                subjectStudents.Filter = _ => false;
                noSubjectStudents.Filter = null;
            }
            else
            {
                subjectStudents.Filter = obj =>
                        obj is Student student &&
                        student.Subjects.Any(sbj => sbj.Id == subject.Id);
                noSubjectStudents.Filter = obj =>
                        obj is Student student &&
                        student.Subjects.All(sbj => sbj.Id != subject.Id);
            }
        }
    }
}
XML
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
<UserControl x:Class="FacultyWpfApp1ButtonStudents.Views.StudentsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:FacultyWpfApp1ButtonStudents.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <!--<DockPanel>-->
    <DataGrid Grid.Row="1" 
                    ItemsSource="{Binding Source={StaticResource noSubjectStudents}}"                                              
                    SelectedItem="{Binding SelectedStudent}"                          
                    SelectedIndex="2"
                    x:Name="MainDataGrid"                                         
                    AutoGenerateColumns="False"                                  
                    CanUserAddRows="True"
                    GridLinesVisibility="Vertical"                                  
                    VerticalGridLinesBrush="DarkGray"
                    AlternatingRowBackground="LightGray">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="AddInSubjectsStudentsJoinView" HorizontalAlignment="Center" VerticalAlignment="Top" Padding="5,0"
                                    Background="Transparent" 
                                    BorderThickness="0" 
                                    Foreground="Green"
                                    FontWeight="Bold"
                                    Command=""
                                    CommandParameter=""/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="IdStudent" Binding="{Binding Id}" Width="Auto"/>
            <DataGridTextColumn Header="NameStudent" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Description" Binding="{Binding Description}"  Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
    <!--</DockPanel>-->
</UserControl>
XML
48
49
50
51
52
53
54
55
56
57
58
    <GroupBox Grid.Row="2" Header="SubjectsStudentsJoinView">
        <!--<ContentControl Content="{Binding SubjectsStudentsJoinView}"/>-->
        <DataGrid ItemsSource="{Binding Source={StaticResource subjectStudents}}"
                    AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Имя" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Описание" Binding="{Binding Description}"/>
            </DataGrid.Columns>
        </DataGrid>
    </GroupBox>
Добавлено через 10 минут
dev3214, реализация реал-тайм изменения фильтрации по замене элементов в коллекции... уже гораздо сложнее.
Можно добавить прокси свойство изменяющееся при изменении коллекции.

Добавлено через 47 секунд
Пока сделайте всё остальное, а дальше посмотрим как лучше реализовать детали.
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
29.10.2023, 18:53  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока сделайте всё остальное, а дальше посмотрим как лучше реализовать детали.
Прошу прощения... Ещё заметил...

Область-2
В коллекции(DataGrid или ListBox) для каждой записи добавить кнопку.
Пользователь выбирает запись.
Пользователь нажимает кнопку: Студент из Области-2 удаляется и добавляется в Области-3


С учётом выше описанного как изменится решение?
В двух словах... Что искать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
29.10.2023, 19:10
Цитата Сообщение от dev3214 Посмотреть сообщение
С учётом выше описанного как изменится решение?
Добавить изменения в Модель - не проблема.

А вот обеспечить обновление фильтрации.... придётся что-то неординарное придумать.

Вы пока сделайте кнопки, команды, изменение моделей.
Refresh фильтрации уже потом покажу как допилить.
0
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
30.10.2023, 12:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавить изменения в Модель - не проблема.
А вот обеспечить обновление фильтрации.... придётся что-то неординарное придумать.
Вы пока сделайте кнопки, команды, изменение моделей.
Refresh фильтрации уже потом покажу как допилить.
Извините, но в упор не понимаю...
Частями понимаю... В комплексе на ~70% понимаю...
А чтобы оно обновлялось... не понимаю...
Сделал примитивно:
https://github.com/jhon65496/F... hon65496_3

Вроде удалил запись...
В своих фантазиях ожидаю, что коллекция должна уведомить все View, которые её используют... INotifyPropertyChanged...
Но увы...

Вопросы
1. Можно ли размещать код в файлах "*.xaml.cs"*?
Имею ввиду **SubjectsView.xaml.cs**.

Читал в различных источниках:
- нельзя размещать;
- можно(нужно) размещать для UserControl.

Как правильно?


2. SubjectsView.xaml.cs. Где создаётся Subject subject?
Расположение: SubjectsView.xaml.cs

Где создаётся Subject subject?
Где присваивается значение Subject subject?

Где создаётся Student student?
Где присваивается значение Student student?

Я понимаю типа такого:
C#
1
2
3
4
5
6
private void OnSelectedSubjectChanged(object sender, SelectionChangedEventArgs e)
{
    Subject subject  =  (Subject)sender;
 
    // дальше код ....
}

У вас.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void OnSelectedSubjectChanged(object sender, SelectionChangedEventArgs e)
{
    if (mainVM.SelectedSubject is not Subject subject)
    {
        subjectStudents.Filter = _ => false;
        noSubjectStudents.Filter = null;
    }
    else
    {
        subjectStudents.Filter = obj =>
                obj is Student student &&
                student.Subjects.Any(sbj => sbj.Id == subject.Id);
        noSubjectStudents.Filter = obj =>
                obj is Student student &&
                student.Subjects.All(sbj => sbj.Id != subject.Id);
    }
}



3. Как(Где) в MainWindowViewModel свойству SelectedSubject присваивается значение?

В SubjectsView.xaml.cs?

C#
1
2
3
4
5
6
7
8
9
10
11
private void OnSelectedSubjectChanged(object sender, SelectionChangedEventArgs e)
{
    if (mainVM.SelectedSubject is not Subject subject)
    {
        // ...
    }
    else
    {
            // ...
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.10.2023, 18:02
Цитата Сообщение от dev3214 Посмотреть сообщение
1. Можно ли размещать код в файлах "*.xaml.cs"*?
Имею ввиду **SubjectsView.xaml.cs**.
Читал в различных источниках:
- нельзя размещать;
- можно(нужно) размещать для UserControl.
Как правильно?
С точки зрения соблюдения архитектуры - это детали реализации View, которые паттерн не оговаривает.
С точки зрения читаемости кода, принятых соглашений, рекомендаций, корректной работы Дизайнера XAML, то использование Code Behind не рекомендуется.

Цитата Сообщение от dev3214 Посмотреть сообщение
3. Как(Где) в MainWindowViewModel свойству SelectedSubject присваивается значение?
Через привязку: SelectedItem="{Binding SelectedSubject}".

Цитата Сообщение от dev3214 Посмотреть сообщение
2. SubjectsView.xaml.cs. Где создаётся Subject subject?
Он не создаётся, а получается из свойства mainVM.SelectedSubject.

Вот это выражение mainVM.SelectedSubject is not Subject subject пытается получить из свойства mainVM.SelectedSubject экземпляр Subject и присвоить его локальной переменной subject. Так как в выражении задан not, то возвращается true если извлечение НЕ удалось. Например, в начальном соcтоянии, когда ещё не выбрана ни одна строчка, значение свойства будет null.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2023, 18:02

Можно ли увеличить скорость ответа БД
Привет всем у меня возник такой вопрос как можно увеличить скорость ответа бд, иногда когда долго не запускаю старые программы(которые я...

Как увеличить скорость передачи?
Тут недавно создавал тему, мне порекомендовали использовать WCF, а точнее порекомендовал этот хороший человек тык. Там он показал...

Как увеличить скорость работы программы?
Всем привет! Программа проходит 6/8 тестов (тесты неизвестны), а на последние 2 превышен лимит времени. Прошу помощи. Задача: ...

Как увеличить скорость загрузки страницы
Сам asp-файл 200кБ. Эта страница выводит данные в таблицу(20x20) из базы(Access) 1. Влияет ли размер asp-файла на скорость загрузки? 2....

Потоки, увеличить скорость работы программы
как увеличить скорость работы программы входные параметры 8,00000 0,01 5 0 0 0 4 4 0 4 4 5 5


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
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, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru