WPF+EF Core入门:制作可视化窗体软件

2023-11-11

原因:
最近要面试一家公司,公司有对WPF架构的要求,然后就开始自学了。
功能描述:
加载所有学生信息、名字筛选学生信息、重置筛选、新增学生信息、修改学生信息、删除学生信息。

窗体样式:
在这里插入图片描述
操作步骤:
一、引用文件包:(进去管理NuGet程序包,引入EF Core所需的三个包)
在这里插入图片描述
二、创建实体模型类:(这里以Student实体模型类为例)
在这里插入图片描述

    public class Student
	{
       		 //学生学号
        	public int StudentId { get; set; }
        	//学生姓名
       		 public string StudentName { get; set; }
       		 //学生性别
        	public string StudentSex { get; set; }
        	//学生年龄
        	public int StudentAge { get; set; }
        	//学生住址
        	public string StudentAddress { get; set; }
	 }

三、创建数据库上下文类:(必须以Context结尾)
在这里插入图片描述

 public class StudentContext : DbContext
    {
        //数据库表格
        public DbSet<Student> Students { get; set; }
        //重构Context方法
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //数据库连接语句
            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=StudentDB;Integrated Security = true");
        }
    }

四、使用NuGet包管理命令生成数据库和表:

先输入  Add-Migration Name   命令(Name可以自定义命名),等到数据库创建成功后,
再输入  Update-Database  命令。
成功创建后会有生成的数据库生成文件:

在这里插入图片描述

五、创建StudnetDAL类:
在这里插入图片描述

public class StudentDAL
{
    //获取学生信息
    public static List<Student> Select()
    {
        StudentContext db = new StudentContext();
        return db.Students.ToList();
    }

    //新增学生信息
    public static bool Insert(Student student)
    {
        StudentContext db = new StudentContext();
        db.Students.Add(student);
        return db.SaveChanges() > 0;
    }

    //修改学生信息
    public static bool Update(Student student)
    {
        StudentContext db = new StudentContext();
        db.Entry(student).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
        return db.SaveChanges() > 0;
    }

    //删除学生信息
    public static bool Delete(Student student)
    {
        StudentContext db = new StudentContext();
        var studnet1 = db.Students.Find(student.StudentId);
        db.Students.Remove(studnet1);
        return db.SaveChanges() > 0;
    }

    //根据学号获取学生信息
    public static Student GetStudent(int StudetId)
    {
        StudentContext db = new StudentContext();
        return db.Students.SingleOrDefault(s => s.StudentId == StudetId);
    }

}

六、编辑XAML主窗体:(前面的东西都是.Net Core的东西,现在才和WPF搭边)
在这里插入图片描述

<Window x:Class="WefApp7._17.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:WefApp7._17"
        mc:Ignorable="d"
        Title="学生信息" Height="450" Width="800">
    <Grid>
        <StackPanel Orientation="Horizontal" >
            <TextBlock Text="关键词" VerticalAlignment="Center" Margin="10 -380 0 0"/>
            <TextBox Width="200" Height="25" Name="Search" Margin="10 -380 0 0"></TextBox>
            <Button Content="查找"  Width="70" Height="25" Margin="10 -380 0 0" Name="Select" Click="Select_Click" ></Button>
            <Button Content="重置" Width="70" Height="25" Margin="10 -380 0 0" Click="Reset_Click"></Button>
            <Button Content="新增" Width="70" Height="25" Margin="10 -380 0 0" Click="Add_Click" ></Button>
        </StackPanel>

        <DataGrid ItemsSource="{Binding}" ColumnWidth="*" CanUserAddRows="False" CanUserSortColumns="False" AutoGenerateColumns="False" Margin="0 60 0 0" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="学号" Binding="{Binding StudentId}"/>
                <DataGridTextColumn Header="姓名" Binding="{Binding StudentName}"/>
                <DataGridTextColumn Header="性别" Binding="{Binding StudentSex}"/>
                <DataGridTextColumn Header="年龄" Binding="{Binding StudentAge}"/>
                <DataGridTextColumn Header="地址" Binding="{Binding StudentAddress}"/>
                <DataGridTemplateColumn Header="操作">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="修改" Width="60" Height="25" Background="White" Foreground="Black" Tag="{Binding StudentId}" Click="Edit_Click"/>
                                <Button Content="删除" Width="60" Height="25" Background="Red" Foreground="White"
                                        Tag="{Binding StudentId}" Click="Delete_Click" />
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

七、主窗体后台代码:(由于没有用到MVVM,所以感觉很笨)
在这里插入图片描述

 /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            //加载所有数据
            this.DataContext = StudentDAL.Select();

        InitializeComponent();
    }

    //点击搜索按钮
    private void Select_Click(object sender, RoutedEventArgs e)
    {
        //获取搜索关键词
        var search = (this.FindName("Search") as TextBox).Text;
        //获取学生信息
        var list = StudentDAL.Select();
        //筛选学生信息
        if(!string.IsNullOrEmpty(search))
        {
            list = list.Where(s => s.StudentName.Contains(search)).ToList();
        }
        //绑定筛选后的学生信息
        this.DataContext = list;
    }

    //点击重置按钮
    private void Reset_Click(object sender, RoutedEventArgs e)
    {
        //重置窗体信息
        (this.FindName("Search") as TextBox).Text = "";
        this.DataContext = StudentDAL.Select();
    }

    //点击修改按钮
    private void Edit_Click(object sender, RoutedEventArgs e)
    {
        //获取学生学号
        int studetnId = Convert.ToInt32(((Button)sender).Tag);
        //获取学生信息
        var student = StudentDAL.GetStudent(studetnId);
        if (student != null)
        {
            //调用有参构造方法打开窗体
            AddStudent addStudent = new AddStudent(student);
            addStudent.ShowDialog();
            //刷新界面信息
            this.DataContext = StudentDAL.Select();
        }
    }

    //点击新增按钮
    private void Add_Click(object sender, RoutedEventArgs e)
    {
        //新增学生信息
        AddStudent addStudent = new AddStudent();
        //打开页面
        addStudent.ShowDialog();
        //刷新学生信息
        this.DataContext = StudentDAL.Select();
    }

    //点击删除按钮
    private void Delete_Click(object sender, RoutedEventArgs e)
    {
        //学生学号
        int studetnId = Convert.ToInt32(((Button)sender).Tag);
        //获取对应的学生信息
        var student = StudentDAL.GetStudent(studetnId);
        //删除警告
        var result = MessageBox.Show($"当真要删除‘{student.StudentName}’的信息?","删除警告",MessageBoxButton.OKCancel,MessageBoxImage.Question);
        //执行删除
        if (result == MessageBoxResult.OK)
        {
            //删除学生信息
            StudentDAL.Delete(student);
        }
        //刷新数据
        this.DataContext = StudentDAL.Select();
    }
}

八、学生信息处理窗体:

在这里插入图片描述

<Window x:Class="WefApp7._17.Views.AddStudent"
        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:WefApp7._17.Views"
        mc:Ignorable="d" WindowStyle="None" AllowsTransparency="True" WindowStartupLocation="CenterScreen"
        Title="AddStudent" Height="400" Width="400" Loaded="AddStudent_Loaded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="60"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="60"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock FontSize="30" FontWeight="Bold" Text="学生信息处理" VerticalAlignment="Center"></TextBlock>

        <StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center">
            <TextBlock Text="学号" VerticalAlignment="Center"></TextBlock>
            <TextBox Name="txtStudentId" IsReadOnly="True" Width="200"></TextBox>
            <TextBlock Text="姓名" VerticalAlignment="Center"></TextBlock>
            <TextBox Name="txtStudentName" Width="200"></TextBox>
            <TextBlock Text="性别" VerticalAlignment="Center"></TextBlock>
            <StackPanel Orientation="Horizontal">
                <RadioButton Name="RadMan"  Content="男" />
                <RadioButton Name="RadWoman" Margin="10 0 0 0" Content="女" />
            </StackPanel>
            <TextBlock Text="年龄" VerticalAlignment="Center"></TextBlock>
            <TextBox Name="txtStudentAge" Width="200"></TextBox>
            <TextBlock Text="家庭住址" VerticalAlignment="Center"></TextBlock>
            <TextBox Name="txtStudentAddress" Width="200"></TextBox>
        </StackPanel>
        
        <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Width="70" Height="25" Content="确定" Click="btnSave_Click"></Button>
            <Button Width="70" Height="25" Margin="10 0 10 0" Content="取消" Click="btnCancel_Click"></Button>
        </StackPanel>
    </Grid>
</Window>

九、学生信息处理窗体后台代码:
在这里插入图片描述

	/// <summary>
    /// AddStudent.xaml 的交互逻辑
    /// </summary>
    public partial class AddStudent : Window
    {
        //学生信息
        public Model.Student Studnet = new Model.Student();
        /// <summary>
        /// 有学生信息参数的构造方法
        /// </summary>
        /// <param name="student"></param>
        public AddStudent(Model.Student student)
        {
            //获取学生信息
            Studnet = student;
            InitializeComponent();
        }

        /// <summary>
        /// 没有参数的构造方法
        /// </summary>
        public AddStudent()
        {
            InitializeComponent();
        }

        //学生信息页面窗体加载事件
        private void AddStudent_Loaded(object sender, RoutedEventArgs e)
        {
            //根据是否有学号,判断是 新增学生信息 还是 修改学生信息
            if (Studnet.StudentId > 0)
            {
                //修改时绑定学生信息
                (this.FindName("txtStudentId") as TextBox).Text = Studnet.StudentId.ToString();
                (this.FindName("txtStudentName") as TextBox).Text = Studnet.StudentName;
                if (Studnet.StudentSex == "男")
                {
                    (this.FindName("RadMan") as RadioButton).IsChecked = true;
                }
                else if (Studnet.StudentSex == "女")
                {
                    (this.FindName("RadWoman") as RadioButton).IsChecked = true;
                }
                (this.FindName("txtStudentAge") as TextBox).Text = Studnet.StudentAge.ToString();
                (this.FindName("txtStudentAddress") as TextBox).Text = Studnet.StudentAddress.ToString();
            }
        }

        //点击确定按钮
        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            //获取文本内的学生信息
            Student theStudnet = new Student()
            {
                StudentName = (this.FindName("txtStudentName") as TextBox).Text,
                StudentSex = (this.FindName("RadMan") as RadioButton).IsChecked == true ? "男" : "女",
                StudentAge = Convert.ToInt32((this.FindName("txtStudentAge") as TextBox).Text),
                StudentAddress = (this.FindName("txtStudentAddress") as TextBox).Text
            };

            //根据学号判断是 执行修改 还是 执行新增
            if (Studnet.StudentId > 0)
            {
                //修改学生信息
                theStudnet.StudentId = Studnet.StudentId;
                StudentDAL.Update(theStudnet);
            }
            else
            {
                //新增学生信息
                StudentDAL.Insert(theStudnet);
            }
            //结束弹窗
            this.DialogResult = true;
        }

        //点击取消按钮
        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            //结束弹窗
            this.DialogResult = false;
        }
    }

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF+EF Core入门:制作可视化窗体软件 的相关文章

随机推荐

  • 期货手续费怎么计算?

    期货手续费怎么计算 另一种按照成交金额的比例 收取费用 一般是万分之几 对应计算公式为 N手某期货合约手续费 开仓 平仓成交价 交易单位 手续费率 N手 比如 螺纹钢的手续费是成交金额的万分之一 且螺纹钢的价格是元 那么投资者购买一手螺纹钢
  • 安装sitemap插件时遇到found 4 low severity vulnerabilities

    small debug 安装sitemap插件时遇到found 4 low severity vulnerabilities 正在安装sitemap插件 npm install hexo generator sitemap save 适合提
  • CSS_calc() 函数内部怎么使用scss变量

    使用 calc 函数来计算主体元素的宽度 其中通过 语法将 SCSS 变量转换为 CSS 变量 然后使用加法运算符 和乘法运算符 来计算宽度值 main width 100px main padding 10px main width ca
  • Unity 打包exe时添加管理员权限

    第一步 打开WindowsPlayer sln 路径 Editor Data PlaybackEngines windowsstandalonesupport Source WindowsPlayer 第二步 修改level level改成
  • 带你进入 OpenAI 的世界

    2021年11月的 Microsoft Ignite 微软带来了全新的 Azure OpenAI Service 通过新的 Azure 认知服务能够访问 OpenAI 强大的 GPT 3 模型 虽然微软还没有正式开放 Open AI Ser
  • charles手机模拟器的连接

    charles手机模拟器的连接 1 第一步 打开虚拟机设备 2 第二步 去掉window peoxy的勾选项 对app端测试 3 点击proxy选中proxy Setting 4 勾选这个 默认端口是8888
  • Linux下五种I/O模型详解(阻塞IO、非阻塞IO、IO复用、信号驱动、异步IO)

    https blog csdn net gui951753 article details 82348485 感谢博主 我已收藏
  • 异步编程(async 和 await)

    1 概念 异步编程是一项关键技术 可以直接处理多个核心上的I O阻塞和并发操作 2 使用场景 对于存在IO密集型 例如从网路请求数据 访问数据库和写入到文件系统 和CPU密集型 例如大量的计算 的任务可以选择异步编程 3 异步编程针对于IO
  • Linux下安装操作Git远程仓库与本地仓库同步的教程

    主机操作系统 Centos 6 7 安装配置 GIT邮箱 leiyuxing205 gmail com 一GIT简介 Git是一个开源的分布式版本控制系统 用以有效 高速的处理从很小到非常大的项目版本管理 Git 是 Linus Torva
  • 通过linux定时任务删除es日志索引

    能过linux定时任务删除es日志索引 项目用上了elk 产生的日志索引要定时 其一个方法 通过linux定时任务 调用es接口删除索引 bin bash 删除ELK30天前的日志 计算索引名称包含的日期 比如这里是 Y m d 2023
  • 深入浅出统计学(十四)卡方分布

    基本概念 问题 总结 卡方检验步骤 自由度计算
  • 百度前端实习生面试经历

    说实话 这应该是自己第一次认真准备 又很在意的面试 非常感谢学长的内推 昨天从下午三点一直到晚上七点经历了三场面试 每场大约半小时左右 前两场技术面 最后一面是高级项目经理的 软实力 面试 因为我没做过服务器端 所以基本没有涉及服务器端的知
  • c++实现简单分数统计

    include
  • CHAR与VARCHAR字段类型的适用场景

    在知乎看到的 特意做个笔记 CHAR CHAR适合存储很短的字符串 或者所有值都接近同一个长度 例如 CHAR非常适合存储密码的MD5值 因为这是一个定长的值 对于经常变更的数据 CHAR也比VARCHAR更好 因为定长的CHAR类型不容易
  • 如何制作一个百货小程序

    在这个数字化时代 小程序已成为各行各业的必备工具 其中 百货小程序因其便捷性和多功能性 越来越受到人们的青睐 那么 如何制作一个百货小程序呢 下面 我们就详细介绍一下无需编写代码的步骤 一 进入后台管理 首先 您需要注册并登录 乔拓云 操作
  • STM32+ESP8266连接电脑Qt网络上位机——准备工作

    准备工作 先使用手机和电脑实现局域网 保证电脑的上位机和手机APP 实现服务器和客户机无障碍通信 文章目录 一 准备工作 二 手机作为服务器 三 电脑作为服务器 一 准备工作 工具 手机端 NeTorch 网络调试工具 电脑端 野火网络调试
  • Maven设置网络中央仓库的镜像

    使用国内阿里云的镜像进行设置 在Maven的安装路径下的conf下的settings xml文件中进行配置 将下面的代码复制到settings py文件中
  • 三层交换机及VLAN(入门)

    文章目录 三层交换机及VLAN VLAN入门 1 数据链路层的基础知识 1 1什么是数据链路层 1 2数据链路层的基本功能 2 以太网基本定义 2 1 MAC地址简介 2 2 以太网数据帧的格式 3 交换机的工作原理 3 1交换机的作用 3
  • go语言中的if语句

    go语言中的if语句 go语言中的if语句和其他语言中的类似 都是根据给定的条件表达式运算结果来 判断执行流程 go语言if语句语法 if 布尔表达式 在布尔表达式为 true 时执行 注意 在go语言中 布尔表达式不用使用括号 go语言i
  • WPF+EF Core入门:制作可视化窗体软件

    原因 最近要面试一家公司 公司有对WPF架构的要求 然后就开始自学了 功能描述 加载所有学生信息 名字筛选学生信息 重置筛选 新增学生信息 修改学生信息 删除学生信息 窗体样式 操作步骤 一 引用文件包 进去管理NuGet程序包 引入EF