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

Как обнулить значения TextBox в команде после сохранения их в БД

21.03.2023, 15:34. Показов 7436. Ответов 134

Студворк — интернет-сервис помощи студентам
В TextBox я записываю данные которые потом сохраняются в бд, а как обновлять потом ТекстБоксы после добавления в команде, чтобы они обнулялись для добавления новых данных, чтобы пользователю не приходилось их стирать?

RelayCommand

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
using System;
using System.Windows.Input;
 
namespace WarhammerAGM
{
    /*Этот класс реализует интерфейс ICommand, благодаря чему с помощью подобных команды мы сможем направлять вызовы к ViewModel. 
     * Ключевым здесь является метод Execute(), который получает параметр и выполняет действие, переданное через конструктор команды.*/
    public class RelayCommand : ICommand
    {
        Action<object?> execute;
        Func<object?, bool>? canExecute;
 
        public event EventHandler? CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
 
        public RelayCommand(Action<object?> execute, Func<object?, bool>? canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }
 
        public bool CanExecute(object? parameter)
        {
            return canExecute == null || canExecute(parameter);
        }
 
        public void Execute(object? parameter)
        {
            execute(parameter);
        }
    }
}
ApplicationViewModel

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
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.Internal;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using WarhammerAGM.Models;
using Xceed.Wpf.Toolkit;
 
namespace WarhammerAGM
{
    public class ApplicationViewModel
    {
        ApplicationContext db = new ApplicationContext();
        RelayCommand? addCommand;
        RelayCommand? editCommand;
        RelayCommand? deleteCommand;
        public BestiaryCreature BestiaryCreature { get; private set; } = new();
        public ObservableCollection<BestiaryCreature> BestiaryCreatures { get; set; }
        public ApplicationViewModel()
        {
            /*В конструкторе класса загружаем данные из бд в локальный кэш*/
            db.Database.EnsureCreated();
            db.BestiaryCreatures.Load();
            BestiaryCreatures = db.BestiaryCreatures.Local.ToObservableCollection();
        }
 
        // команда добавления
        public RelayCommand AddCommand
        {
            get
            {
                return addCommand ??
                  (addCommand = new RelayCommand((o) =>
                  {
                      BestiaryCreature bestiaryCreature = BestiaryCreature;
                      db.BestiaryCreatures.Add(bestiaryCreature);
                      db.SaveChanges();    
                      MessageBox.Show("Добавление прошло успешно");
                      
                  }));
            }
        }
    }
}
MainWindow.xaml
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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<Window
        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:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    xmlns:AttachedBehaviors="clr-namespace:WarhammerAGM.AttachedBehaviors" xmlns:local="clr-namespace:WarhammerAGM"
    x:Class="WarhammerAGM.MainWindow"
    mc:Ignorable="d"
        Title="MainWindow" Height="540" Width="960">
    <Window.DataContext>
        <local:ApplicationViewModel/>
    </Window.DataContext>
 
 
 
    <Grid>
        <TabControl FontSize="36">
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5">
                    <TabControl FontSize="22">
                        <TabItem Header="Бестиарий">
                            <Grid Background="#FFE5E5E5">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <ListView x:Name="ListViewBestiaryAddEditChange" Grid.Column="0" ItemsSource="{Binding BestiaryCreatures}">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel>
                                                <TextBlock Text="{Binding Name}" FontSize="16" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                                <GridSplitter Grid.Column="1" ShowsPreview="False" Width="3" HorizontalAlignment="Center" VerticalAlignment="Stretch" />
                                <Grid Grid.Column="2">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <ScrollViewer Grid.Row="0" Background="Gray">
                                        <Grid x:Name="GridStatsEnter" Background="Gray" DataContext="{Binding BestiaryCreature}">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>
                                            <Grid Grid.Row="0">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="*"/>
                                                </Grid.ColumnDefinitions>
                                                <TextBlock Grid.Column="0" Text="Название:" Margin="5"/>
                                                <TextBox Text="{Binding Name}" Grid.Column="1" Margin="5"/>
                                            </Grid>
 
 
                                            <Grid Grid.Row="1" Margin="3">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                </Grid.ColumnDefinitions>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <TextBlock Grid.Column="0" Grid.Row="1" Text="ББ"/>
                                                <TextBox x:Name="BBStats" Grid.Column="0" Grid.Row="2" Text="{Binding Melee}" MaxLength="3" AttachedBehaviors:TextBoxBehavior.IsInteger="True" />
                                                <TextBlock Grid.Column="1" Grid.Row="1" Text="Б"/>
                                                <TextBox x:Name="BStats" Grid.Column="1" Grid.Row="2" Text="{Binding Ballistics}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="2" Grid.Row="1" Text="Сил"/>
                                                <TextBox x:Name="PowStats" Grid.Column="2" Grid.Row="2" Text="{Binding Power}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="3" Grid.Row="1" Text="Вын"/>
                                                <TextBox x:Name="EndurStats" Grid.Column="3" Grid.Row="2" Text="{Binding Endurance}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="4" Grid.Row="1" Text="Лов"/>
                                                <TextBox x:Name="DexStats" Grid.Column="4" Grid.Row="2" Text="{Binding Dexterity}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="5" Grid.Row="1" Text="Инт"/>
                                                <TextBox x:Name="IntStats" Grid.Column="5" Grid.Row="2" Text="{Binding Intelligence}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="6" Grid.Row="1" Text="Вос"/>
                                                <TextBox x:Name="PerStats" Grid.Column="6" Grid.Row="2" Text="{Binding Perception}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="7" Grid.Row="1" Text="СВ"/>
                                                <TextBox x:Name="WillPowStats" Grid.Column="7" Grid.Row="2" Text="{Binding Willpower}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="8" Grid.Row="1" Text="Тов"/>
                                                <TextBox x:Name="PartStats" Grid.Column="8" Grid.Row="2" Text="{Binding Partnership}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                            </Grid>
 
 
                                            <Grid Grid.Row="2">
 
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
 
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="50"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                </Grid.ColumnDefinitions>
 
                                                <TextBlock Grid.Row="0" Grid.Column="0" Text="Раны:" Margin="5"/>
                                                <TextBox Text="{Binding Wounds}" Grid.Row="0" Grid.Column="1" Margin="5"/>
                                                <TextBlock Grid.Row="0" Grid.Column="2" Text="Скорость:" Margin="5"/>
                                                <xctk:MaskedTextBox Grid.Row="0" Grid.Column="3" Text="{Binding Speed}" Mask="00/00/00/00"/>
 
                                            </Grid>
 
 
                                            <Grid Grid.Row="3">
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <Expander Grid.Row="0" Margin="5" Header="Описание" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox FontSize="14" Text="{Binding Description}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="1" Margin="5" Header="Умения" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Skills}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="2" Margin="5" Header="Таланты" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Talents}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="3" Margin="5" Header="Броня и Оружие" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <Grid.RowDefinitions>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                        </Grid.RowDefinitions>
                                                        <TextBlock Grid.Row="0" Text="Броня" FontSize="14"/>
                                                        <TextBox Grid.Row="1" Text="{Binding Armor}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="50"/>
                                                        <TextBlock Grid.Row="2" Text="Оружие" FontSize="14"/>
                                                        <TextBox Grid.Row="3" Text="{Binding Weapons}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="50"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="4" Margin="5" Header="Оборудование" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Equipment}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="5" Margin="5" Header="Особенности" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Features}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="6" Margin="5" Header="Дополнительнрые особенности" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding AdditionalFeatures}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                            </Grid>
                                        </Grid>
                                    </ScrollViewer>
                                    <Grid Grid.Row="1">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <Button Grid.Column="0" Content="Добавить" Margin="1" Command="{Binding AddCommand}"/>
                                            <Button Grid.Column="1" Content="Изменить" Margin="1" Command="{Binding EditCommand}" CommandParameter="{Binding ElementName=ListViewBestiaryAddEditChange, Path=SelectedItem}"  />
                                            <Button Grid.Column="2" Content="Удалить" Margin="1" Command="{Binding DeleteCommand}" CommandParameter="{Binding ElementName=ListViewBestiaryAddEditChange, Path=SelectedItem}"  />
                                        </Grid>
                                    </Grid>
                                </Grid>
                            </Grid>
</Window>
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2023, 15:34
Ответы с готовыми решениями:

Как после выполнения процедуры, обнулить значения Request-a?
Ситуация следующая: при передачи значений формы POST методом, по значению поля определяется процедура формирования данных в таблице....

Как обнулить значение textbox?
Вводишь год - нажимаешь кнопочку - получаешь ответ Когда хочешь ввести новое значение, ответ в текстовом боксе не убирается до нажатия...

Сохранения значения slect после обновления страницы
Доброго время суток всем! Сразу хочу сказать что в яве я особо не рулю. На каком-то форуме нашел подходящий скрипт и попробывал его...

134
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
25.03.2023, 18:41  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп, не хотела делать так, чтобы кнопки были выбор "Новую" "Копировать" после "Добавить". Мне кажется было бы нагружено очень. Поэтому сделала так
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
129
130
131
132
public class ApplicationViewModel : ViewModelBase
    {
        private readonly ApplicationContext db = new ApplicationContext();
 
        public ObservableCollection<BestiaryCreature> BestiaryCreatures { get; }
 
        public BestiaryCreature BestiaryCreature
        {
            get => Get<BestiaryCreature>()!;
            private set => Set(value ?? throw new ArgumentNullException(nameof(value)));
        }
       private BestiaryCreature _selectedItem;
 
        public BestiaryCreature? SelectedItem
        {
            get => _selectedItem; 
            set => Set(ref _selectedItem, value);
        }
 
        protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue)
        {
            base.OnPropertyChanged(propertyName, oldValue, newValue);
 
            if (propertyName == nameof(SelectedItem))
            {
                if (SelectedItem == null)
                { return; }
               //Присваивание BestiaryCreature данных выделенного элемента SelectedItem кроме Id
                BestiaryCreature = new()
                {
                    Name = SelectedItem.Name,
                    Description = SelectedItem.Description,
                    Melee = SelectedItem.Melee,
                    Ballistics = SelectedItem.Ballistics,
                    Power = SelectedItem.Power,
                    Endurance = SelectedItem.Endurance,
                    Dexterity = SelectedItem.Dexterity,
                    Intelligence = SelectedItem.Intelligence,
                    Perception = SelectedItem.Perception,
                    Willpower = SelectedItem.Willpower,
                    Partnership = SelectedItem.Partnership,
                    Wounds = SelectedItem.Wounds,
                    Speed = SelectedItem.Speed,
                    Skills = SelectedItem.Skills,
                    Talents = SelectedItem.Talents,
                    Armor = SelectedItem.Armor,
                    Weapons = SelectedItem.Weapons,
                    Equipment = SelectedItem.Equipment,
                    AdditionalFeatures = SelectedItem.AdditionalFeatures,
                    Features = SelectedItem.Features
                };
            }
        }
        public ApplicationViewModel()
        {
            /*В конструкторе класса загружаем данные из бд в локальный кэш*/
            db.Database.EnsureCreated();
            db.BestiaryCreatures.Load();
            BestiaryCreature = new();
            BestiaryCreatures = db.BestiaryCreatures.Local.ToObservableCollection();
        }
        // команда добавления
        public RelayCommand AddCommand => GetCommand(() =>
        {
            //Если был выделен уже элемент из списка ListView
            BestiaryCreature? bestiaryCreature = SelectedItem as BestiaryCreature;
            if (bestiaryCreature != null)
            {
 
                if (bestiaryCreature.Name == BestiaryCreature.Name)
                {
                    MessageBox.Show("Такое название уже существует");
                    return;
                }
                else
                {
                    db.BestiaryCreatures.Add(BestiaryCreature);
                    db.SaveChanges();
                    BestiaryCreature = new();
                    MessageBox.Show("Добавление прошло успешно");
                    SelectedItem = null; //отменяем веделение элемента ListView
                }
            }
            else //если не был выделен
            {
                db.BestiaryCreatures.Add(BestiaryCreature);
                db.SaveChanges();
                BestiaryCreature = new();
                MessageBox.Show("Добавление прошло успешно");
            }
            
        });
        // команда редактирования
        public RelayCommand EditCommand => GetCommand<BestiaryCreature>(selectedItem =>
        {
            // получаем выделенный объект
            BestiaryCreature? bestiaryCreature = selectedItem as BestiaryCreature;
            if (bestiaryCreature == null) return;
            bestiaryCreature.Name = BestiaryCreature.Name;
            bestiaryCreature.Description = BestiaryCreature.Description;
            bestiaryCreature.Melee = BestiaryCreature.Melee;
            bestiaryCreature.Ballistics = BestiaryCreature.Ballistics;
            bestiaryCreature.Power = BestiaryCreature.Power;
            bestiaryCreature.Endurance = BestiaryCreature.Endurance;
            bestiaryCreature.Dexterity = BestiaryCreature.Dexterity;
            bestiaryCreature.Intelligence = BestiaryCreature.Intelligence;
            bestiaryCreature.Perception = BestiaryCreature.Perception;
            bestiaryCreature.Willpower = BestiaryCreature.Willpower;
            bestiaryCreature.Partnership = BestiaryCreature.Partnership;
            bestiaryCreature.Wounds = BestiaryCreature.Wounds;
            bestiaryCreature.Speed = BestiaryCreature.Speed;
            bestiaryCreature.Skills = BestiaryCreature.Skills;
            bestiaryCreature.Talents = BestiaryCreature.Talents;
            bestiaryCreature.Armor = BestiaryCreature.Armor;
            bestiaryCreature.Weapons = BestiaryCreature.Weapons;
            bestiaryCreature.Equipment = BestiaryCreature.Equipment;
            bestiaryCreature.AdditionalFeatures = BestiaryCreature.AdditionalFeatures;
            bestiaryCreature.Features = BestiaryCreature.Features;
 
                db.Entry(bestiaryCreature).State = EntityState.Modified;
                db.SaveChanges();
            BestiaryCreature = new();
            SelectedItem = null; //отменяем выделение элемента ListView
        });
       
        // команда удаления
        public RelayCommand DeleteCommand => GetCommand<BestiaryCreature>(selectedItem =>
        {
            db.BestiaryCreatures.Remove(selectedItem);
            db.SaveChanges();
        });
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
25.03.2023, 19:23
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
if (bestiaryCreature.Name == BestiaryCreature.Name)
Это в БД нужно проверять, а не в VM.

Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Поэтому сделала так
Если вас устраивает - оставьте так.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
26.03.2023, 23:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это в БД нужно проверять, а не в VM
Как это в бд проверять?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если вас устраивает - оставьте так.
Если это можно улучшить, то конечно бы переделала. Любая критика в пользу я же только разбираюсь во всем
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
26.03.2023, 23:28
VeronikaKlever, скиньте фиксацию чтобы я видел внесённые вами изменения.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
27.03.2023, 19:38  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
скиньте фиксацию
https://github.com/FoxyFine/WPF_Project
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
27.03.2023, 20:53
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Как это в бд проверять?
C#
80
81
82
                //if (bestiaryCreature.Name == BestiaryCreature.Name)
                string name = BestiaryCreature.Name;
                if ( db.BestiaryCreatures.FirstOrDefault(bc => bc.Name == name) is not null)
Добавлено через 12 минут
C#
34
35
36
37
38
39
40
41
42
43
44
45
46
47
            if (propertyName == nameof(SelectedItem))
            {
                BestiaryCreature old = (BestiaryCreature)oldValue!;
 
                // Проверяем есть ли такая сущность в контексте.
                if (db.BestiaryCreatures.Contains(old))
                {
                    // Восстановление значений если есть несохранённые изменения.
                    db.Entry(old).Reload();
                }
                BestiaryCreature = (BestiaryCreature?)newValue ?? new();
 
                // if (SelectedItem == null)
                // дальше всё не нужно
Добавлено через 13 минут
C#
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
        public RelayCommand AddCommand => GetCommand(() =>
        {
            //Если был выделен уже элемент из списка ListView
            //BestiaryCreature? bestiaryCreature = SelectedItem as BestiaryCreature;
            //if (bestiaryCreature != null)
            //{
 
            //if (bestiaryCreature.Name == BestiaryCreature.Name)
            string name = BestiaryCreature.Name;
            if (db.BestiaryCreatures.FirstOrDefault(bc => bc.Name == name) is not null)
            {
                MessageBox.Show("Такое название уже существует");
                return;
            }
            else
            {
                // Сначала запоминаем Id сущности, отсоединяем её и заново создаём,
                // чтобы она появилась у нас в локальном кеше.
                int id = BestiaryCreature.Id;
                if (id > 0)
                {
                    db.Entry(BestiaryCreature).State = EntityState.Detached;
                    db.BestiaryCreatures.Find(id);
                }
 
                // Обнуляем Id и  добавляем как новую
                BestiaryCreature.Id = 0;
                db.BestiaryCreatures.Add(BestiaryCreature);
                db.SaveChanges();
                // BestiaryCreature = new(); лишнее. Всё равно при отмене SelectedItem сбросится.
                MessageBox.Show("Добавление прошло успешно");
                SelectedItem = null; //отменяем веделение элемента ListView
            }
            //}
            //else //если не был выделен
            //{
            //    db.BestiaryCreatures.Add(BestiaryCreature);
            //    db.SaveChanges();
            //    BestiaryCreature = new();
            //    MessageBox.Show("Добавление прошло успешно");
            //}
 
        });
Добавлено через 2 минуты
Проверку уникальности имени лучше делать в БД.
Но пока не стал менять.

Добавлено через 1 минуту
C#
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
        public RelayCommand EditCommand => GetCommand<BestiaryCreature>(selectedItem =>
        {
            //// получаем выделенный объект
            //BestiaryCreature? bestiaryCreature = selectedItem as BestiaryCreature;
            //if (bestiaryCreature == null) return;
            //bestiaryCreature.Name = BestiaryCreature.Name;
            //bestiaryCreature.Description = BestiaryCreature.Description;
            //bestiaryCreature.Melee = BestiaryCreature.Melee;
            //bestiaryCreature.Ballistics = BestiaryCreature.Ballistics;
            //bestiaryCreature.Power = BestiaryCreature.Power;
            //bestiaryCreature.Endurance = BestiaryCreature.Endurance;
            //bestiaryCreature.Dexterity = BestiaryCreature.Dexterity;
            //bestiaryCreature.Intelligence = BestiaryCreature.Intelligence;
            //bestiaryCreature.Perception = BestiaryCreature.Perception;
            //bestiaryCreature.Willpower = BestiaryCreature.Willpower;
            //bestiaryCreature.Partnership = BestiaryCreature.Partnership;
            //bestiaryCreature.Wounds = BestiaryCreature.Wounds;
            //bestiaryCreature.Speed = BestiaryCreature.Speed;
            //bestiaryCreature.Skills = BestiaryCreature.Skills;
            //bestiaryCreature.Talents = BestiaryCreature.Talents;
            //bestiaryCreature.Armor = BestiaryCreature.Armor;
            //bestiaryCreature.Weapons = BestiaryCreature.Weapons;
            //bestiaryCreature.Equipment = BestiaryCreature.Equipment;
            //bestiaryCreature.AdditionalFeatures = BestiaryCreature.AdditionalFeatures;
            //bestiaryCreature.Features = BestiaryCreature.Features;
 
            //db.Entry(bestiaryCreature).State = EntityState.Modified;
            db.SaveChanges();
            //BestiaryCreature = new();
            SelectedItem = null; //отменяем веделение элемента ListView
        });
Добавлено через 32 секунды
Отлаживать времени нет. Но вроде так должно работать.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
27.03.2023, 22:07  [ТС]
Элд Хасп Перестало работать удаление(скрин ошибки прикреплен)
А также теперь, если добавлять новый элемент в БД (В моем примере "Добавление 1")
После добавления TextBox не обнуляются и при смене имени оно меняется и в ListView, но после добавления оно сохраняется как отдельный элемент
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД  

Как обнулить значения TextBox в команде после сохранения их в БД  
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
27.03.2023, 22:12  [ТС]
И если выделить элемент, поменять там имя и после этого нажать кнопку добавить, то новый элемент не создается
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
28.03.2023, 01:31
VeronikaKlever, уже токо завтра посморю.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
28.03.2023, 20:18
VeronikaKlever, что за папка Bestiary которая включена в проект, но которой нет в Репоитории?
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
28.03.2023, 20:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
что за папка Bestiary
Папка предполагалась для хранения Json файлов пока я не отказалась от этой идеи
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
28.03.2023, 22:44
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Папка предполагалась для хранения Json файлов пока я не отказалась от этой идеи
Надо либо включить в проект что-то из этой папки, либо удалить её из проекта.
А то она в проекте есть, а в Репозиторий не сохраняется, и клонирование приводит к ошибке в Проекте.

Добавлено через 4 минуты
Довёл до ума:
C#
29
30
31
32
33
34
35
36
37
38
39
40
41
        protected override void OnPropertyChanged(string propertyName, object? oldValue, object? newValue)
        {
            base.OnPropertyChanged(propertyName, oldValue, newValue);
 
            if (propertyName == nameof(SelectedItem))
            {
                BestiaryCreature? @new = (BestiaryCreature?)newValue;
                if (@new is null)
                    BestiaryCreature = new();
                else
                    BestiaryCreature = db.BestiaryCreatures.AsNoTracking().First(bc => bc.Id == @new.Id);
            }
        }
C#
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
        /// <summary>Добавление сущности <see cref="BestiaryCreature"/>.</summary>
        public RelayCommand AddCommand => GetCommand(() =>
        {
 
            string? name = BestiaryCreature.Name;
            if (db.BestiaryCreatures.FirstOrDefault(bc => bc.Name == name) is not null)
            {
                MessageBox.Show("Такое название уже существует");
                return;
            }
            else
            {
                // Обнуляем Id и добавляем как новую
                BestiaryCreature.Id = 0;
                db.BestiaryCreatures.Add(BestiaryCreature);
                db.SaveChanges();
 
                MessageBox.Show("Добавление прошло успешно");
 
                //отменяем веделение элемента ListView
                SelectedItem = null;
            }
        });
C#
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
        /// <summary>Обновление сущности <see cref="BestiaryCreature"/>.</summary>
        public RelayCommand EditCommand => GetCommand(() =>
        {
            // Запоминаем в локальной переменной
            var bestCr = BestiaryCreature;
 
            // Заменяем сущности
            int index = BestiaryCreatures.TakeWhile(bc => bc.Id != bestCr.Id).Count();
            BestiaryCreatures.RemoveAt(index);
            BestiaryCreatures.Insert(index, bestCr);
 
            // Сохраняем изменения
            db.SaveChanges();
 
            //отменяем веделение элемента ListView
            SelectedItem = null;
        });
C#
96
97
98
99
100
101
102
103
104
105
106
        /// <summary>Удаление сущности <see cref="SelectedItem"/>.</summary>
        public RelayCommand DeleteCommand => GetCommand(
            () =>
            {
                if (SelectedItem is BestiaryCreature selectedItem)
                {
                    db.BestiaryCreatures.Remove(selectedItem);
                    db.SaveChanges();
                }
            },
            () => SelectedItem is BestiaryCreature);
Остальные изменения смотрите в фиксации.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
29.03.2023, 15:15  [ТС]
Элд Хасп, почему пространство имен не видит? Я клонировала заново репозиторий.

Заработало когда еще раз клонировала и пересобрала решение. В первый раз делала те же самые действия, но почему то не сработало
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД  
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
29.03.2023, 15:40  [ТС]
Элд Хасп
После добавления первого элемента TextBox не обнуляются.
После добавления второго элемента в бд и последующих ListView не обновляется, после перезагрузки приложения в ListView начинают отображаться все добавленные элементы.
Если до перезагрузки изменить (Кнопка "Сохранить Изменения") первый добавленный элемент то после этого добавленные элементы начинают отображаться в ListView.
Также если выделить первый элемент в ListView, то он будет отображать данные последнего сохраненного элемента, а не свои
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
29.03.2023, 15:47
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
почему пространство имен не видит? Я клонировала заново репозиторий.
1) Без пересборки Дизайнер XAML не видит информацию из кода;
2) В Студии используется огромное количество служебных и временных файлов. Иногда они формируются неправильно и Студия "сама не поймёт" что неправильно. Часто помогает уничтожение всех невидимых папок (начинающихся с точки), bin, obj, Packages. По факту, реклонирование репозитория это и делает.
0
 Аватар для Andrey-MSK
3391 / 2277 / 388
Регистрация: 14.08.2018
Сообщений: 7,699
Записей в блоге: 4
29.03.2023, 15:52
VeronikaKlever,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Часто помогает уничтожение всех невидимых папок
Меню Build - Clean Solution, затем Build - Rebuild Solution
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
29.03.2023, 15:54
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
После добавления первого элемента TextBox не обнуляются.
Это не проверял.

Цитата Сообщение от VeronikaKlever Посмотреть сообщение
После добавления второго элемента в бд и последующих ListView не обновляется
Это точно проверял и работало.

Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Также если выделить первый элемент в ListView, то он будет отображать данные последнего сохраненного элемента, а не свои
Надо проверять.

Я же не делал полного тестирования.
Просто показал как избежать "простыней" кода с помощью функциональных возможностей EF.
Ваш способ создания временного клона - тоже приемлем, но нужно его "довести до ума".
Один из вариантов - это использование Мапперов.
Вот здесь есть мой "самодельный" Маппер. Там же посмотрите как его использовать.

Добавлено через 47 секунд
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Меню Build - Clean Solution, затем Build - Rebuild Solution
К сожалению, это не всегда помогает. Скорее даже чаще не помогает.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
29.03.2023, 16:35  [ТС]
Добавила в AddCommand
C#
1
BestiaryCreature = new(); // обнуление TextBox
для обнуления TextBox вроде пока проблем не вижу, буду дальше тестировать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public RelayCommand AddCommand => GetCommand(() =>
        {
 
            string? name = BestiaryCreature.Name;
            if (db.BestiaryCreatures.FirstOrDefault(bc => bc.Name == name) is not null)
            {
                MessageBox.Show("Такое название уже существует");
                return;
            }
            else
            {
                // Обнуляем Id и добавляем как новую
                BestiaryCreature.Id = 0;
                db.BestiaryCreatures.Add(BestiaryCreature);
                db.SaveChanges();
                BestiaryCreature = new(); // обнуление TextBox
                MessageBox.Show("Добавление прошло успешно");
 
                //отменяем выделение элемента ListView
                SelectedItem = null;
            }
        });
0
 Аватар для Andrey-MSK
3391 / 2277 / 388
Регистрация: 14.08.2018
Сообщений: 7,699
Записей в блоге: 4
29.03.2023, 16:44
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
C#
1
BestiaryCreature = new(); // обнуление TextBox
А откуда вы ID новой записи получите с такой строкой? После SaveChanges() EF записывает в объект новый ID, который сгенерировала СУБД.

Добавлено через 4 минуты
VeronikaKlever, Будете по новой перечитывать из БД, вместо того чтобы просто добавить новый объект со своим ID в коллекцию...

Добавлено через 1 минуту
Свойства для полей TextBox - это свойства VM и к модели они никакого отношения не должны иметь. Из этих свойств потом собирается объект для модели и сохраняется в БД.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
29.03.2023, 16:44  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это в БД нужно проверять, а не в VM
Вы говорили что лучше проверки в бд лучше делать. Как правильно оформлять проверку на уникальность элемента в бд?
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2023, 16:44

Идеи для создания валидации кода в команде, сохранения стандартов
Добрый день дорогие коллеги. Появился такой вопрос решил тут спросить, очень надеюсь на ваши ответы. Есть небольшая команда разработчков...

Отобразить текст в Textbox из другого TextBox в разных кодировках без сохранения в файл
Доброго всем времени суток! Есть на форме несколько Textbox&quot;сов. В 1-й Textbox вписывается текст как образец, а в остальных этот же...

После нажатия кнопки "остановить" не получается обнулить значения
Здравстуйте! Делали курсовик с другом и столкнулись с одной проблемой, мы после нажатия кнопки &quot;остановить&quot; не можем обнулить...

Visual Studio Code Есть ли поддержка сохранения файла в 2х местах или запуска батника после сохранения
Здравствуйте. Кто знает есть ли в Visual Studio Code возможность сохранять файцл в 2х местах или запускать определенный батник после...

TextBox color - Как окрасить на форме TextBox от разного значения
Всем привет У меня вопрос по VB. На форме много TextBox и окрашивать их по индивидуальному значению получается достаточно громоздкий код....


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru