TodoList项目笔记
TodoList项目笔记
-
项目地址:
https://github.com/getimad/wpf-todo-list -
在
SQLServer中手动创建数据库并生成数据表
> CREATE DATABASE MyTodoList;
> USE MyTodoList;
> CREATE TABLE TASKS (
Id INT IDENTITY(1,1) PRIMARY KEY,
Content VARCHAR(MAX) NOT NULL,
Priority CHAR(10) CHECK (Priority IN ('Priority 1', 'Priority 2', 'Priority 3', 'Priority 4')) NOT NULL,
Date DATETIME DEFAULT SYSDATETIME()
);
- 新建
App.config,写入如下内容
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MyTodoListDB" connectionString="Server=.;Database=MyTodoList;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
- 安装依赖
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
......
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.*" />
<PackageReference Include="System.Data.SqlClient" Version="4.*" />
</ItemGroup>
</Project>
- 主要的
项目目录结构
- Models // 模型层
- Task.cs // Task类,数据模型
- Utilities // 工具层
- DataAccess.cs // 数据库的crud操作
- Helper.cs // 读取app.config的sql连接字符串
- MainWindow.xaml // UI窗体
- MainWindow.xaml.cs // 主程序代码
- 模型数据如下
// Models.Task.cs
using System;
namespace MyTodoList.Models
{
public class Task
{
public int Id { get; set; }
public string? Content { get; set; }
public string? Priority { get; set; }
public DateTime Date { get; set; }
}
}
- 工具层
Helper.cs代码如下
using System.Configuration;
namespace MyTodoList.Utilities
{
public static class Helper
{
// 静态方法,无需创建实例即可调用
public static string GetConnectionString(string name)
{
// 从配置文件的ConnectionStrings节点获取指定名称的连接字符串
return ConfigurationManager.ConnectionStrings[name].ConnectionString;
}
}
}
- 工具层
DataAccess.cs代码如下(完成数据库的Crud操作)
using Dapper;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using MyTodoListProgram.Models;
namespace MyTodoListProgram.Utilities
{
public class DataAccess
{
public static List<MyTodoListProgram.Models.Task> GetTasks()
{
using var connection = new SqlConnection(Helper.GetConnectionString("MyTodoListDB"));
connection.Open();
var query = "SELECT * FROM Tasks";
return connection.Query<MyTodoListProgram.Models.Task>(query).ToList();
}
public static void AddTask(string content,string priority)
{
using var connection = new SqlConnection(Helper.GetConnectionString("MyTodoListDB"));
connection.Open();
var query = "INSERT INTO Tasks (Content, Priority) VALUES (@content, @priority)";
connection.Execute(query, new { Content=content, Priority=priority });
}
public static void DeleteTask(int id)
{
using var connection = new SqlConnection(Helper.GetConnectionString("MyTodoListDB"));
connection.Open();
var query = "DELETE FROM Tasks WHERE Id = @id";
connection.Execute(query, new { Id=id });
}
}
}
- 工具层
DynamicComparer.cs代码如下- 功能: 实现了一个动态比较器,用于在运行时根据属性名称对泛型对象进行比较(排序)
using System.Collections.Generic;
namespace MyTodoListProgram.Utilities
{
// 实现了 IComparer<T> 接口,使得任意类型 T 的对象都可以通过指定属性名进行排序
internal class DynamicComparer<T>:IComparer<T>
{
private string _propertyName;
public DynamicComparer(string propertyName)
{
_propertyName = propertyName;
}
public int Compare(T x,T y) {
// 根据属性名获取 Property 对象
var property = typeof(T).GetProperty(_propertyName);
// 通过 GetValue() 方法动态获取两个对象的属性值
var valueX = property.GetValue(x);
var valueY = property.GetValue(y);
// 进行最终比较,自动排序各种数据类型(数字、字符串、日期等)
return Comparer<object>.Default.Compare(valueX,valueY);
}
}
}

浙公网安备 33010602011771号