你相信“物竞天择,适者生存”这样的学说吗?但是我们今天却在提倡“尊老爱幼,救死扶伤”,帮助并救护弱势群体;第二次世界大战期间,希特勒认为自己是优等民族,劣势民族应该被消灭,这样的思想带来的战争之痛,至今让人难以忘怀。我们的文化里面有这样一句话“天无绝人之路”,在西方世界是“神爱世人”。这个世代所创造的生产力大过先前的任何世代,但是这个世代的人过的仿佛比任何一个世代的人都忙碌;能否今天已经感到无路可走,或是说今天已经在经济上迫在眉睫的时候,心里不被忧虑或是烦乱抓住呢?当思想今天我们生活在这个这么恰到好处的自然界时,我相信,我们比麻雀贵重的多,深被造物主所爱。

这次博客的标题是数据库,自定义弹窗,表单验证;我们的目标是一个实用的权限控制框架,所以我觉得自己更像是一个组装产品的人,把其他人分享的成果拿来一点一点组装;好了,先看下截图:

接下来就们就针对这几个方面逐个来介绍下:

数据库:

今天我们在操作数据库的时候,已经很难接受手写sql语句的做法了,很多的时候都会考虑选用ORM框架,即可以自由的使用linq表达式,在特殊的场合又可以使用sql语句;原本打算使用dapper,但是在使用linq表达式的时候,发现网上可参考的资料不多,思索一番,决定使用先前用过的chloe。目前数据库使用的是sqlite数据库,当然大家要是需要改换其他的数据库,自行改换就是了,在项目中已经引入了针对SqlServer,MySql,Oracle的chloe所支持的组件,并且数据操作类也留下了其他数据库的扩展入口,看下截图与代码:

 1 using Chloe;
2 using Chloe.SQLite;
3 using System;
4 using System.Collections.Generic;
5 using System.Configuration;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9
10 namespace HQ.Plugin.SysManagerPlugin.Common
11 {
12 public class DbHelper
13 {
14
15 private static readonly string dbType = ConfigurationManager.AppSettings["DbType"].ToLower();
16 private static readonly string sqliteconn = ConfigurationManager.ConnectionStrings["SQLiteConnectionString"].ConnectionString;
17 private static IDbContext sqliteDbContext;
18 private static IDbContext SqliteDbContext
19 {
20 get
21 {
22 if (sqliteDbContext == null)
23 {
24 sqliteDbContext = new SQLiteContext(new SQLiteConnectionFactory(sqliteconn));
25 }
26 return sqliteDbContext;
27 }
28 set
29 {
30 sqliteDbContext = value;
31 }
32 }
33 private static IDbContext dbContext;
34 public static IDbContext DbContext
35 {
36 get
37 {
38 switch (dbType)
39 {
40 case "sqlite":
41 dbContext = SqliteDbContext;
42 break;
43 }
44 return dbContext;
45 }
46 set
47 {
48 dbContext = value;
49 }
50 }
51
52 }
53 }

数据操作类

自定义弹窗:

自定义弹窗是通过在Window窗体界面中加入ContentControl控件,然后在ContentControl控件中通过加载用户控件来实现的,效果是这样的:

贴下Window窗体的界面布局代码:

 1 <Window x:Class="HQ.Plugin.SysManagerPlugin.View.Dialog.CustomDialog"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:HQ.Plugin.SysManagerPlugin.View.Dialog"
7 mc:Ignorable="d"
8 Title="CustomDialog" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" BorderBrush="{DynamicResource IndexColor}" BorderThickness="1" WindowStyle="None"
9
10 >
11 <Grid>
12 <Grid>
13 <Grid.RowDefinitions>
14 <RowDefinition Height="30"></RowDefinition>
15 <RowDefinition Height="*"></RowDefinition>
16 <RowDefinition Height="Auto"></RowDefinition>
17 </Grid.RowDefinitions>
18 <DockPanel Grid.Row="0" Name="TitleBar" Cursor="Hand">
19 <DockPanel.Background>
20 <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
21 <GradientStop Color="White" Offset="0"/>
22 <GradientStop Color="#ADD8E6" Offset="1"/>
23 </LinearGradientBrush>
24 </DockPanel.Background>
25 <TextBlock DockPanel.Dock="Left" Name="DialogTitle" Foreground="Gray" Margin="5 7 5 0"/>
26 <Button DockPanel.Dock="Right" Content="✕" IsCancel="True" HorizontalAlignment="Right" BorderBrush="Transparent" BorderThickness="0" Width="30" Background="Transparent" Foreground="Gray"/>
27 </DockPanel>
28 <Border Grid.Row="1" Margin="5 5 5 0" BorderThickness="0" BorderBrush="{DynamicResource IndexColor}">
29 <ContentControl x:Name="contentContainer" />
30 </Border>
31 <Border Grid.Row="2" BorderThickness="0 1 0 0" BorderBrush="{DynamicResource IndexColor}" Height="40" Margin="5 0 5 5">
32 <WrapPanel Name="dpBottom" HorizontalAlignment="Right" VerticalAlignment="Center">
33 <Button Content="确定" Name="btnOK" Style="{StaticResource ButtonBaseStyle}" />
34 <Button Content="取消" Name="btnCancel" IsCancel="True" Style="{StaticResource ButtonBaseStyle}" />
35 </WrapPanel>
36 </Border>
37 </Grid>
38 </Grid>
39 </Window>

这是使用弹出层的代码:

1         private void AddEvent()
2 {
3 var userControl = new View.RoleDialog.Add();
4 RoleAdd = new RoleAddViewModel();
5 userControl.DataContext = RoleAdd;
6 CustomDialog dialog = new CustomDialog(userControl, "添加", LoginUserHelper.MainWindow, userControl.Height, userControl.Width);
7 dialog.ShowDialog(AddRoles);
8 }

表单验证:

表单验证参考链接:表单验证

因为源码会分享出来,大家自由查看,所以这里就只是做下大致的介绍,对源码感兴趣的朋友,欢迎加入

QQ群:720369133

源码会在群里给大家分享,也恳请大家提出宝贵意见!

系列目录:

WPF权限控制——【1】界面布局

WPF权限控制——【2】模块、菜单、按钮

WPF权限控制——【3】数据库、自定义弹窗、表单验证的更多相关文章

  1. 看用Tornado如何自定义实现表单验证

    我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言, ...

  2. python26:自定义form表单验证

    一.自定义Form的原理 1.1 各种form表单验证比较 只有python提供了form表单验证,其他的都没有提供.django提供的功能还不够强大.最强大的是微软的ASP.NET!我们可以自己写一 ...

  3. lumen手记:自定义Validate表单验证

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天开始跳lumen的表单验证Validate类的坑,确实好坑!!! 首先,lumen的表单验证返回是无状态的json格式api,这... 所有开 ...

  4. web前端框架之自定义form表单验证

    自定义form验证初试 .在后端创建一个类MainForm,并且在类中自定义host ip port phone等,然后写入方法,在post方法中创建MainForm对象,并且把post方法中的sel ...

  5. tornado之自定义form表单验证

    直接上链接吧:银角的地址 源码下载链接:点我点我点我...

  6. [php基础]PHP Form表单验证:PHP form validator使用说明

    在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...

  7. jquery validate强大的jquery表单验证插件

    jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...

  8. WPF权限控制框架——【4】抛砖引玉

    写第一篇"权限控制框架"系列博客是在2021-01-29,在这不到一个月的时间里,收集自己零碎的时间,竟然写出了一个"麻雀虽小,五脏俱全"的权限控制框架:对于一 ...

  9. WPF权限控制——【2】模块、菜单、按钮

    周末没有工作,没有写博客,因为觉得休息很必要:曾听到一句话是这样说的:"你们得救在乎归回安息:你们得力在乎平静安稳".当我想到太阳没秒钟要燃烧420万吨的燃料时,想到的就是造物主的 ...

随机推荐

  1. Language Guide (proto3) | proto3 语言指南(十三)JSON映射

    JSON Mapping - JSON映射 Proto3支持JSON中的规范编码,使得在系统之间共享数据更加容易.下表按类型对编码进行了描述. 如果JSON编码的数据中缺少一个值或者它的值为null, ...

  2. 一:优化Docker中的Spring Boot应用:单层镜像方法

    优化Docker中的Spring Boot应用:单层镜像方法 1.Docker关键概念 2.镜像层内容很重要 3.镜像层影响部署 4.Docker中的Spring Boot应用 5.单层方法 5.1 ...

  3. (二)基于shard-jdbc中间件,实现数据分库分表

    基于shard-jdbc中间件,实现数据分库分表 Sharding-JDBC简介 Sharding配置示意图 1.水平分割 1.1 水平分库 1.2 水平分表 2.Shard-jdbc中间件 2.1 ...

  4. java 石头剪子布游戏

    源代码 StoneGame.java 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.I ...

  5. 最短路-SPFA算法&Floyd算法

    SPFA算法 算法复杂度 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环. SPFA一般情况复杂度是O(m)最坏情况下复杂度和朴素 ...

  6. python flask_sqlalchemy 多态 polymorphic 实现单表继承

    sqlalchemy 多态 polymorphic 实现单表继承 sqlaclchemy中的单表继续就是以一个模型类为基类,其他模型类继承基类,所有模型类的的数据都存一张表里面(也可以是多张,只不过基 ...

  7. dedecms不能保存jpeg格式图片的解决方法

    方法如下: 进入织梦的后台管理目录,默认是dede文件夹,找到/inc/inc_archives_functions.php文件. 在文件里查找gif|jpg|,我找到了4个, 在它们后面加jpeg的 ...

  8. Spark+Kafka实时监控Oracle数据预警

    目标: 监控Oracle某张记录表,有新增数据则获取表数据,并推送到微信企业. 流程: Kafka实时监控Oracle指定表,获取该表操作信息(日志),使用Spark Structured Strea ...

  9. Java泛型学习---第二篇

    泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ...

  10. Codeforces Global Round 7 D1. Prefix-Suffix Palindrome (Easy version)(字符串)

    题意: 取一字符串不相交的前缀和后缀(可为空)构成最长回文串. 思路: 先从两边取对称的前后缀,之后再取余下字符串较长的回文前缀或后缀. #include <bits/stdc++.h> ...