Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
WPF

Сохранение данных из коллекции в файл (MVVM)

24.11.2022, 12:47. Показов 4093. Ответов 45

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане!
Начал разрабатывать приложение на wpf+mvvm. Но столкнулся с отсутствием знаний с сохранением данных с учетом mvvm.
Задача следующая:
пользователь вводит данные, они сохраняются в коллекции ObservableCollection<T> и отображаются в DataGrid главного окна. Нужно сохранить эти данные, чтобы при повторном открытии приложения они снова отображались в DataGrid.
При этом коллекцию нужно отсортировать по свойству модели (тип свойства DateTime).
Искал, читал примеры по этой теме, но пока результата не добился

Добавлено через 35 минут

Класс модели:
C#
1
2
3
4
5
6
7
8
   internal class Reminder
    {
        public int IndexReminder { get; set; } //номер напоминания
        public string TittleReminder { get; set; } //заголовок
        public string MessageReminder { get; set; } //сообщение
        public DateTime DateTimeReminder { get; set; } //дата и время напоминания
        public bool statusReminder { get; set; } //статус выполнения напоминания
    }
ViewModel диаологового окна: Ввод данных, сохранение в ObservableCollection

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
internal class AddNewReminder_VM : Base_VM
    {
        #region заголовок окна
        private string _Tittle = "Новое напоминание++";
        /// <summary>Заголовок окна </summary>
        public string Tittle
        {
            get => _Tittle;
            set => Set(ref _Tittle, value);
        }
        #endregion
 
        #region Свойства, привязанные к окну "Новое напоминание"
 
        #region Заголовок
        // Заголовок
        private string _tittleNewReminder;
        public string TittleNewReminder
        {
            get => _tittleNewReminder;
            set=> Set(ref _tittleNewReminder, value);
        }
        #endregion
 
        #region Текст напоминания
        //Содержание напоминания
        private string _contentNewReminder;
        public string ContentNewReminder
        {
            get => _contentNewReminder;
            set => Set(ref _contentNewReminder, value);
        }
        #endregion
                
        #region Дата и время напоминания
 
        private DateTime _dateTimeNewReminder = DateTime.Now;
        public DateTime DateTimeNewReminder
        {
            get => _dateTimeNewReminder;
            set => Set(ref _dateTimeNewReminder, value);
        }
        #endregion
 
        
 
        #endregion
 
        #region Команда добавления нового напоминания
 
        public ICommand AddNewReminderCmd { get; }
        private bool CanAddNewReminderCmdExecute(object p) => true;
        private void OnAddNewReminderCmdExecuted(object p)
        {
            //Создание нового напоминания
            Reminder reminder = new Reminder();
            reminder.IndexReminder = Collections.Reminders.Count + 1;
            reminder.TittleReminder = TittleNewReminder;
            reminder.MessageReminder = ContentNewReminder;
            reminder.statusReminder = false;
            reminder.DateTimeReminder = DateTimeNewReminder;
 
            Collections.Reminders.Add(reminder);
 
 
        }
 
        #endregion
 
        #region Конструктор
        // Конструктор без парам
 
        public AddNewReminder_VM()
        {
            //Лямда-Команда создания нового напоминания
            AddNewReminderCmd = new LamdaCommand(OnAddNewReminderCmdExecuted, CanAddNewReminderCmdExecute);
            
 
        }
 
        #endregion
    }
DataGrid главного окна

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
 <DataGrid AutoGenerateColumns="False"
                              CanUserAddRows="False"
                              CanUserDeleteRows="False"
                              CanUserReorderColumns="False"
                              IsReadOnly="True"
                              Background="LightGray"
                              ItemsSource ="{Binding Source={x:Static serv:Collections.Reminders}}"
                              SelectedItem="{Binding SelectedReminder}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Заголовок" 
                                                Width="250"
                                                Binding="{Binding TittleReminder}"/>
                            <DataGridTextColumn Header="Текст"
                                                Width="*"
                                                Binding="{Binding MessageReminder}">
                                <DataGridTextColumn.ElementStyle>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="TextWrapping" Value="Wrap"/>
                                    </Style>
                                </DataGridTextColumn.ElementStyle>
                            </DataGridTextColumn>
                            <DataGridTextColumn Header="Дата напоминания"
                                                Width="200"
                                                Binding="{Binding DateTimeReminder, StringFormat={}{0:dd.MM.yyyy}}"/>
                            
                            <DataGridTextColumn Header="Время напоминания"
                                                Width="200"
                                                Binding="{Binding DateTimeReminder, StringFormat={}{0:HH:mm}}" />                            
                        </DataGrid.Columns>
                    </DataGrid>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2022, 12:47
Ответы с готовыми решениями:

WPF MVVM Бинарная сериализация коллекции классов
Всем привет. Вот есть задачка. Класс. class Employer : INotifyPropertyChanged { #region Properties ...

Программное заполнение коллекции и отображение в DataGrid с использованием MVVM
Здравствуйте. Только начинаю вникать в MVVM. Нашел такой пример: Модель: namespace MVVMTest.Model { public class Person :...

MVVM как при заполнении (изменении) коллекции ObservableCollection избежать копий
Есть ObservableCollection в которой хранится класс с полем Name. Надо чтоб при попытке задать имя элемента которое уже встречается в...

45
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 13:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nickolass Посмотреть сообщение
Подскажи, плиз, может есть способ выполнять эту операцию быстрее?
Ускорить можно только изменив реализацию ObservableCollection.
Если её прослушивают, то на каждый Add будет вызываться все прослушки.
Нужно заглушить уведомление и вызвать один раз после полного добавления.

В стандартной ObservableCollection это невозможно.
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 14:06  [ТС]
Andrey-MSK, с СУБД уже практика была) И с SQLite, и c MySQL. Спасибо) Сейчас нужно с файлами разобраться

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ускорить можно только изменив реализацию ObservableCollection.
Если её прослушивают, то на каждый Add будет вызываться все прослушки.
Нужно заглушить уведомление и вызвать один раз после полного добавления.
В стандартной ObservableCollection это невозможно.
Спасибо, понял) Это пока не мой уровень)

Подскажи еще, пожалуйста, почему свойство только для чтения?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// Свойство "только для чтения". То есть без сеттера.
        public static ObservableCollection<Reminder> Reminders { get; /* set; */} = new();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 14:18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ускорить можно только изменив реализацию ObservableCollection.
Nickolass, написал "на скорую руку":
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
    public class ExtendedObservableCollectionExtend<T> : ObservableCollection<T>
    {
        public bool IsNotifiesFrozen { get; private set; }
        private static readonly PropertyChangedEventArgs IsNotifiesFrozenArgs = new(nameof(IsNotifiesFrozen));
        private static readonly PropertyChangedEventArgs ResetPropertiesArgs = new(string.Empty);
        private static readonly NotifyCollectionChangedEventArgs ResetCollectionArgs = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        protected bool SetIsNotifiesFrozen(bool isNotifiesFrozen)
        {
            bool notEquals = IsNotifiesFrozen == isNotifiesFrozen;
            if (notEquals)
            {
                IsNotifiesFrozen = isNotifiesFrozen;
                if (isNotifiesFrozen)
                {
                    OnPropertyChanged(IsNotifiesFrozenArgs);
                }
                else
                {
                    OnPropertyChanged(ResetPropertiesArgs);
                    OnCollectionChanged(ResetCollectionArgs);
                }
            }
            return notEquals;
        }
 
        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (!IsNotifiesFrozen)
            {
                base.OnCollectionChanged(e);
            }
        }
 
        protected override void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (!IsNotifiesFrozen || e == IsNotifiesFrozenArgs)
            {
                base.OnPropertyChanged(e);
            }
        }
 
        public int AddRange(IEnumerable<T> collection, bool isNotifiesFrozen)
        {
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(true);
            int count = 0;
            foreach (var item in collection)
            {
                Add(item);
                count++;
            }
 
            if (isNotifiesFrozen && count > 0)
                SetIsNotifiesFrozen(false);
            return count;
        }
        public int AddRange(IEnumerable<T> collection)
            => AddRange(collection, false);
 
        public void Reset(IEnumerable<T> collection)
            => Reset(collection, false);
        public void Reset(IEnumerable<T> collection, bool isNotifiesFrozen)
        {
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(true);
            Clear();
            AddRange(collection, isNotifiesFrozen);
        }
    }
Добавлено через 6 минут
Цитата Сообщение от Nickolass Посмотреть сообщение
Подскажи еще, пожалуйста, почему свойство только для чтения?
Для разработчика обижается, что статическое свойство всегда указывает на один и тот же экземпляр.

Например, в одном окне вы выводите это свойство:
C#
1
<ItemsControl ItemsSource="{x:Static somename:SomeClass.Reminders}"/>
А где в коде делаете так:SomeClass.Reminders = new (......);
В результате получите в Окне вывод одних элементов, а в коде будете работать с другой коллекцией.
И будете гадать: "Почему я меняю коллекцию, а Окно не обновляется?".
1
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 14:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
написал "на скорую руку"
Круто) Где такому научиться?) Чтобы так писать на скорую руку)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 14:21
Цитата Сообщение от Элд Хасп Посмотреть сообщение
C#
20
OnCollectionChanged(ResetCollectionArgs);
Возможно этот вызов избыточен.
Надо протестировать.

Добавлено через 1 минуту
Цитата Сообщение от Nickolass Посмотреть сообщение
Где такому научиться?) Чтобы так писать на скорую руку)
Опыт, практика, документация, исходники, огромное количество разных задач, примеров.
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 14:24  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Опыт, практика, документация, исходники, огромное количество разных задач, примеров.
У меня ни один год видимо уйдет)

Но есть к чему стремиться) Спасибо
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 14:26
Nickolass, ошибочка...
Чуть неверно реализовал методы Range:
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
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
 
namespace Core2022
{
    public class ExtendedObservableCollectionExtend<T> : ObservableCollection<T>
    {
        public bool IsNotifiesFrozen { get; private set; }
        private static readonly PropertyChangedEventArgs IsNotifiesFrozenArgs = new(nameof(IsNotifiesFrozen));
        private static readonly PropertyChangedEventArgs ResetPropertiesArgs = new(string.Empty);
        private static readonly NotifyCollectionChangedEventArgs ResetCollectionArgs = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        protected bool SetIsNotifiesFrozen(bool isNotifiesFrozen)
        {
            bool notEquals = IsNotifiesFrozen == isNotifiesFrozen;
            if (notEquals)
            {
                IsNotifiesFrozen = isNotifiesFrozen;
                if (isNotifiesFrozen)
                {
                    OnPropertyChanged(IsNotifiesFrozenArgs);
                }
                else
                {
                    OnPropertyChanged(ResetPropertiesArgs);
                    OnCollectionChanged(ResetCollectionArgs);
                }
            }
            return notEquals;
        }
 
        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (!IsNotifiesFrozen)
            {
                base.OnCollectionChanged(e);
            }
        }
 
        protected override void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (!IsNotifiesFrozen || e == IsNotifiesFrozenArgs)
            {
                base.OnPropertyChanged(e);
            }
        }
 
        public int AddRange(IEnumerable<T> collection, bool isNotifiesFrozen)
        {
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(true);
 
            int count = 0;
            foreach (var item in collection)
            {
                Add(item);
                count++;
            }
 
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(false);
            return count;
        }
        public int AddRange(IEnumerable<T> collection)
            => AddRange(collection, false);
 
        public void Reset(IEnumerable<T> collection)
            => Reset(collection, false);
        public void Reset(IEnumerable<T> collection, bool isNotifiesFrozen)
        {
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(true);
 
            Clear();
            AddRange(collection);
 
            if (isNotifiesFrozen)
                SetIsNotifiesFrozen(false);
        }
    }
}
Добавлено через 2 минуты
Цитата Сообщение от Nickolass Посмотреть сообщение
У меня ни один год видимо уйдет)
У меня от уровня "Слышал о Шарпе и даже не слышал о WPF" до уровня "начинающий++" прошло месяца четыре.
К этому времени уже сам стал другим объяснять как и что делать, писать какие-то гайды.
Можете по истории моих тем, вопросов на Форуме посмотреть.
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 14:34  [ТС]
Элд Хасп, вот тут не совсем понимаю как использовать этот класс.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чуть неверно реализовал методы Range
Добавить в проект, и коллекция будет уже не ObservableCollection<T>, а ExtendedObservableCollectionExtend<T>?
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
28.11.2022, 15:04
Цитата Сообщение от Nickolass Посмотреть сообщение
Сейчас нужно с файлами разобраться
Ну тогда в методе чтения из файла записывайте в List<T>, а потом уже переводите в ObservableCollection<T> при загрузке VM. По крайней мере при работе с СУБД это работает очень быстро.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 15:12
Цитата Сообщение от Nickolass Посмотреть сообщение
Добавить в проект, и коллекция будет уже не ObservableCollection<T>, а ExtendedObservableCollectionExtend<T>?
Да.
Обычно такие классы добавляются в отдельный проект типа "Библиотека классов".
В основном проекте задаётся ссылка на проект библиотеки.
Типы из не1ё потом используются как обычные .Net типы.

Добавлено через 2 минуты
С этим классом обновление будет таким:
C#
10
11
12
13
        public static void ResetReminders(IEnumerable<Reminder> reminders)
        {
            Reminders.Reset(reminders, true);
        }
Остальные методы менять не нужно.
1
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 15:21  [ТС]
Элд Хасп, спасибо еще раз) Буду разбираться. Можно по вашему коду здесь если что вопросы позадавать в будущем? (если появятся)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
28.11.2022, 15:26
Цитата Сообщение от Nickolass Посмотреть сообщение
Можно по вашему коду здесь если что вопросы позадавать в будущем? (если появятся)
Если по этой же теме - да.
Если слишком разрастётся я сам разделю тему.
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
28.11.2022, 15:28  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если по этой же теме - да.
Если слишком разрастётся я сам разделю тему.
Спасибо)
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
15.12.2022, 11:42  [ТС]
Элд Хасп, доброго дня!) Подскажите, пожалуйста, в чем может быть проблема? Ищу путь к папке через код:

C#
1
2
var exePath = AppDomain.CurrentDomain.BaseDirectory;
var path = Path.Combine(exePath + @"\..\..\..\Data\Reminders\");
Раньше находил, сейчас выдает очень длинную неправильную строчку:
"D:\\User\\Documents\\Visual Studio 2022\\WPF\\MemoryRefresher\\MemoryRefres her.Net\\bin\\Debug\\net6.0-windows\\\\..\\..\\..\\Data\\Reminders\"

Причем (повторюсь) раньше с этим кодом путь прописывался правильный, а теперь какой-то бред...
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
15.12.2022, 11:53
Цитата Сообщение от Nickolass Посмотреть сообщение
\..\..\..\
Это означает - от текущего каталога подняться на три каталога вверх и перейти в каталог Data\Reminders.

Добавлено через 1 минуту
Nickolass, Описание путей: абсолютных, относительных, UNC и URL
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
15.12.2022, 11:59  [ТС]
Andrey-MSK, Я это знаю) Только вверх не поднимается почему-то

Добавлено через 3 минуты
Из этой строчки
C#
1
var exePath = AppDomain.CurrentDomain.BaseDirectory;
Путь:
"D:\\User\\Документы\\Visual Studio 2022\\WPF\\NewTestMemory\\MemoryRefreshe r.Net\\bin\\Debug\\net6.0-windows"

А из этой:
C#
1
var path = Path.Combine(exePath + @"\..\..\..\Data\Reminders\");
"D:\\User\\Документы\\Visual Studio 2022\\WPF\\NewTestMemory\\MemoryRefreshe r.Net\\bin\\Debug\\net6.0-windows\\\\..\\..\\..\\Data\\Reminders"

В итоге ловлю ошибку, что путь не найден
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
15.12.2022, 12:04
Цитата Сообщение от Nickolass Посмотреть сообщение
В итоге ловлю ошибку, что путь не найден
Конечно не будет найден. Где у вас по факту находится \Data\Reminders\?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
15.12.2022, 12:13
Цитата Сообщение от Nickolass Посмотреть сообщение
сейчас выдает очень длинную неправильную строчку:
После net6.0-windows четыре слеша \\\\? То есть, без экранировки два слеша подряд.
Вы явно не таким образом раньше получали строку.
Вам нужно:
C#
2
var path = Path.Combine(exePath, @"\..\..\..\Data\Reminders");
Какой смысл в вашем варианте использования Path.Combine, если по факту вы сами задаёте путь неправильной конкатенацией.
Поручите это методу. Пусть он сам верно комбинирует отрезки пути.
0
0 / 0 / 0
Регистрация: 24.02.2022
Сообщений: 71
15.12.2022, 12:21  [ТС]
Andrey-MSK,
по факту на 3 каталога выше) Представьте, ничего не менял, а заработало... Само блин) Чего-то может в системе глюкнуло?)

Добавлено через 7 минут
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы явно не таким образом раньше получали строку.
Именно таким, ничего не менял, честно)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 2
15.12.2022, 12:28
Цитата Сообщение от Nickolass Посмотреть сообщение
ничего не менял, а заработало... Само блин)
Посмотрите какая сейчас строка в var path.

Добавлено через 56 секунд
И какую ошибку выдавало: некорректный путь, нет файла, другое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2022, 12:28
Помогаю со студенческими работами здесь

Занесение данных в ListView1 и сохранение данных из переменных в текстовый файл
Привет всем, такая ситуация я заношу информацию в ListView в 3 колонки через переменные и мне нужно сохранить эти данные в текстовый файл. ...

JavaFx, сохранение данных в файл и загрузка данных из файла
Написал программу на JavaFx, в котором есть данные риелторов заносятся в неупорядоченный список на основе массива(фамилия, номер телефона),...

Сохранение данных в файл
Здравствуйте. На сколько мне известно, чтобы сохранить данные в файл надо использовать класс SharedPreferences. Чтобы понять как это...

Сохранение данных в файл
Добрый вечер! Есть задача: В расписании поездов указано: номер поезда, пункт отправления, пункт назначения, время отправления,...

Сохранение данных в файл
Как сохранить (а затем прочитать) в файл массив элементов класса? class SaveToFile { public: char name; String...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru