Я пытаюсь сделать небольшое приложение To-Do для своего школьного проекта. У меня есть одна проблема: я не знаю, как удалять элементы, созданные шаблоном данных в приложении и в базе данных.
Я пытался получить доступ к элементам, получив выбранный элемент, а затем удалив его, но в какой-то момент идентификаторы этих элементов в БД отличаются от идентификаторов в приложении. Я использую SQL-сервер, и в моей базе данных у меня есть одна таблица с 4 столбцами: идентификатор (int, автоматическое увеличение, первичный ключ), Task (varchar), Descr (varchar), Active (bit). Теперь я пытаюсь привязать атрибут флажка isChecked к классу Active of Task в своем приложении.
это мой xaml-код
<Window x:Class = "ToDoApp2.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:ToDoApp2"
mc:Ignorable = "d"
Title = "MainWindow" Height = "600" Width = "400" ResizeMode = "NoResize">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "244*"/>
<ColumnDefinition Width = "149*"/>
</Grid.ColumnDefinitions>
<TreeView x:Name = "TrvMenu" HorizontalAlignment = "Left" Height = "400" VerticalAlignment = "Top" Width = "392" Grid.ColumnSpan = "2">
<TreeView.Resources>
<HierarchicalDataTemplate DataType = "{x:Type local:ToDoTask}" ItemsSource = "{Binding Tasks}">
<StackPanel Orientation = "Horizontal">
<CheckBox Content = "{Binding Title}" IsChecked = "{Binding active}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
<TextBox x:Name = "TaskTb" HorizontalAlignment = "Left" Height = "30" Margin = "0,400,0,0" TextWrapping = "Wrap" VerticalAlignment = "Top" Width = "392" Grid.ColumnSpan = "2"/>
<TextBox x:Name = "DescriptionTb" HorizontalAlignment = "Left" Height = "80" Margin = "0,430,0,0" TextWrapping = "Wrap" VerticalAlignment = "Top" Width = "392" Grid.ColumnSpan = "2"/>
<Button x:Name = "CreateBtn" Content = "Create New Task" HorizontalAlignment = "Left" Margin = "0,510,0,0" VerticalAlignment = "Top" Width = "197" Height = "59" Click = "Button_Click"/>
<Button x:Name = "DeleteBtn" Content = "Delete Selected Task" HorizontalAlignment = "Left" Margin = "197,510,-1,0" VerticalAlignment = "Top" Width = "196" Height = "59" Click = "DeleteBtn_Click" Grid.ColumnSpan = "2"/>
</Grid>
</Window>
это класс, который представляет одну задачу в приложении
public class ToDoTask
{
public ToDoTask()
{
this.Tasks = new ObservableCollection<ToDoTask>();
}
public string Title { get; set; }
public bool active=true;
public ObservableCollection<ToDoTask> Tasks { get; set; }
}
И вот как я добавляю новые задачи в БД и приложение
public MainWindow()
{
InitializeComponent();
SQLCnn init = new SQLCnn();
ObservableCollection<ToDoTask> initList = init.readQuery();
for(int i=0; i < initList.Count; i++)
{
TrvMenu.Items.Add(initList[i]);
}
SQLCnn.connection.Close();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(TaskTb.Text))
{
string value = TaskTb.Text;
string desc = DescriptionTb.Text;
ToDoTask task = new ToDoTask() { Title = value };
task.Tasks.Add(new ToDoTask() { Title = desc });
SQLCnn SQLtask = new SQLCnn();
SQLtask.insertQuery(value, desc);
TrvMenu.Items.Add(task);
}
}
}
Как вы упомянули в своем вопросе, у вас есть проблема с генерацией идентификатора в вашем коде. Вы должны создать метод, в котором вы передаете все необходимые данные для создания своей задачи, и после этого ваша база данных должна вернуть вам идентификатор вновь созданной задачи. Таким образом, в вашем случае метод SQLTask.insertQuery(...)
должен возвращать идентификатор (значение int), который автоматически генерируется вашей базой данных. Теперь вы можете назначить его вновь созданному объекту ToDoTask task = new ToDoTask(); task.Id = ...
и после этого добавить его в список задач. Если вы это сделаете, у вас будет действительное значение идентификатора для удаления задачи из базы данных. И еще одно, поля не поддерживаются в качестве источника привязки, поэтому в классе ToDoTask
вы должны изменить поле active
на свойство, если хотите его связать.
В данном случае все кроме...
В своем проекте вы можете использовать фреймворк и шаблоны, которые научат вас еще многим интересным вещам и повысят качество вашего кода. Таким образом, для улучшения работы с базой данных вы можете использовать ORM, например. Платформа сущностей (https://docs.microsoft.com/en-us/ef/). Чтобы отделить код GUI от кода бизнес-логики, вы можете использовать шаблон MVVM. Здесь у вас есть много вариантов, например. вы можете использовать один из следующих проектов:
Чтобы узнать больше о MVVM, посмотрите на этот вопрос: MVVM: Учебник от начала до конца?
Большое спасибо, я очень ценю ваш ответ. Есть еще одна вещь, которую я хотел бы спросить. Есть ли какая-нибудь команда sql или которая может сбросить автоматически увеличивающийся идентификатор?