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);
        }

    }
}

posted @ 2025-12-02 17:30  安_宁  阅读(5)  评论(0)    收藏  举报