c#桌面应用程序开发--登陆窗口
一.显示登陆窗口
应用程序入口点为Main方法,因此在Main方法中创建登陆窗体。
1)创建登陆窗体(登陆窗体UI已提前创建好);
2)显示窗体,以模式对话框的形式显示,并赋值给result;
3)判断窗体的返回值是否为OK,若是,则显示主窗体,(窗体的对话框结果在相应的窗体中设置,已达到逻辑处理,登陆验证的效果),否则退出程序;
具体代码如下:

二.登陆窗体数据访问方法的编写
1.准备:
1)数据访问层DAL创建:解决方案→新建项目→类库;
2)在DAL中创建管理员数据访问类SysAdminService: DAL→右键→类
3)编写通用数据访问类:负责连接数据库(最基本的格式化SQL语句通用数据访问类),代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration; namespace DAL
{
/// <summary>
/// 通用数据访问类
/// </summary>
class SQLHelper
{
private static string connString = Common.StringSecurity.DESDecrypt(ConfigurationManager.ConnectionStrings["connString"].ToString());//于数据库连接的字符串(配置文件解密) /// <summary>
/// 执行增、删、改操作
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int Update(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ throw ex;
}
finally
{
conn.Close();
}
} /// <summary>
/// 执行单一结果查询
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static object GetSingleResult(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteScalar();
}
catch (Exception ex)
{ throw ex;
}
finally
{
conn.Close();
}
} /// <summary>
/// 返回结果集的查询
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
conn.Close();
throw ex;
}
} }
}
2.登陆窗体数据访问方法编写:
using System.Data.SqlClient;
using Models; namespace DAL
{
/// <summary>
/// 管理员数据访问类
/// </summary>
public class SysAdminService
{
/// <summary>
/// 根据账号和密码返回登陆结果的查询,
/// </summary>
/// <param name="objAdmin"></param>
/// <returns>返回管理员对象,若为空,则表示账号或密码错误</returns>
public SysAdmin AdminLogin(SysAdmin objAdmin)
{
string sql = "select AdminName from Admins where LoginId={0} and LoginPwd={1}";
sql = string.Format(sql, objAdmin.LoginId, objAdmin.LoginPwd); SqlDataReader objReader = SQLHelper.GetReader(sql);
if (objReader.Read())//从数据库查到结果,则表示登陆账号和密码正确,将管理员姓名封装到对象中,并返回对象,以便以后修改账号密码使用
{
objAdmin.AdminName = objReader["AdminName"].ToString();
}
else objAdmin = null;//没查到数据,表示登陆不成功,则清空对象
objReader.Close();
return objAdmin;
}
}
}
3.前台UI逻辑编写(事件+控件)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAL;
using Models; namespace StudentManager
{
public partial class FrmUserLogin : Form
{
SysAdminService objAdminService = new SysAdminService(); public FrmUserLogin()
{
InitializeComponent();
} //登录
private void btnLogin_Click(object sender, EventArgs e)
{
//[1]数据验证
if (this.txtLoginId.Text.Trim().Length == )
{
this.lblMsg.Text = "请输入登陆账号!";
return;
}
if (this.txtLoginPwd.Text.Trim().Length == )
{
this.lblMsg.Text = "请输入登陆密码!";
return;
} //[2]封装对象
SysAdmin objAdmin = new SysAdmin()
{
LoginId = Convert.ToInt32(this.txtLoginId.Text.Trim()),
LoginPwd = this.txtLoginPwd.Text.Trim()
};
//[3]和后台交互,判断登陆信息是否正确
try
{
objAdmin = objAdminService.AdminLogin(objAdmin);
if (objAdmin != null)
{
//保存登陆信息
Program.objCurrentAdmin = objAdmin;
this.DialogResult = DialogResult.OK;//this代表当前窗体
this.Close();
}
else
{
this.lblMsg.Text = "账号或密码错误!";
}
}
catch (Exception ex)
{ MessageBox.Show("数据访问出现异常,登陆失败!具体原因:"+ex.Message);
} }
//关闭
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
} #region 改善用户体验
private void txtLoginId_KeyDown(object sender, KeyEventArgs e)
{
//按回车健代替鼠标单击事件
if(e.KeyValue==)
{
if(this.txtLoginId.Text.Trim().Length != )
{
this.txtLoginPwd.Focus();
}
}
} private void txtLoginPwd_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyValue==)
{
btnLogin_Click(null,null);
}
} #endregion }
}
c#桌面应用程序开发--登陆窗口的更多相关文章
- Win32 程序开发:窗口类结构体 WNDCLASS 和 WNDCLASSEX
一.窗口类结构体简介 窗口类结构体包含了窗口的各种参数信息.比如:窗口的图标.菜单栏.背景颜色.窗口的消息处理等等. 窗口类结构体有两个:WNDCLASS(早期版本) 和 WNDCLASSEX(新版本 ...
- Electron与WEB桌面应用程序开发及其它
这几天在构思项目,研究了一下Electron,记录下来. 说起WEB桌面程序,当前最火的就是Electron了. Electron的架构用一句话总结,就是一个main.js进程加上一个或数个chrom ...
- QtQuick桌面应用程序开发指南 4)动态管理Note对象_B 5)加强外观 6)许多其他的改进
4.2.2 Stateless(不管状态)JavaScript库 为了让开发轻松点, 使用一个JavaScript接口来和数据库交互是个好主意, 它在QML中提供了方便的方法; 在QtCreator中 ...
- QtQuick桌面应用程序开发指导 3)达到UI而功能_B 4)动态管理Note物_A
3.2 把Page Item和Marker Item绑定 之前我们实现了PagePanel组件, 使用了三个state来切换Page组件的opacity属性; 这一步我们会使用Marker和Marke ...
- C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】
(一)Windows窗口(MDICLIENT)样式介绍 /* Windows窗口样式 */ WS_BORDER //带有边框的窗口 WS_CAPTION //带有标题栏的窗口 WS_CHILD //子 ...
- Win32 程序开发:创建一个应用程序窗口
一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...
- electron之Windows下使用 html js css 开发桌面应用程序
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序
一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...
- Python3的桌面程序开发利器:Eric6的环境搭建、使用
本文旨在通过一个简单的demo,介绍基于Python3.PyQT5的环境下开发桌面应用程序的一种方案,当然开发Python的桌面应用程序不止是PyQT 这一种方案,还可以使用Python自带的Tkin ...
随机推荐
- hive JDBC异常到多租户
hive jdbc执行select count(*) from test报错. return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedT ...
- Cloudera API访问
多租户管理页面(admin)操作 cloudera 管理页面页面操作多租户是这样的: 进入到YARN的服务页面,点击Resource Pool,你将会看到已经存在的资源池,然后再点击资源池表格右上角的 ...
- C# 保护进程不被结束(源代码)防任务管理器结束进程
C# 保护进程不被结束(源代码)防任务管理器结束进程 Posted on 2013-03-25 16:03 快乐家++ 阅读(3173) 评论(3) 编辑 收藏 闲来无事,英语又学的太痛苦.看到我妈妈 ...
- ov2640数据
问题部分解决,数据错误的原因是太快了.将0x11->3f 0xd3->7f 哈哈 问题解决 直接降低7670输出频率 调0x11到最大分频比 现在能完整抓拍QVGA的图像 不过就是采集速 ...
- FlatBuffers使用简介
@[tools|flatbuffers|opensource] 概述### Google在今年6月份发布了跨平台序列化工具FlatBuffers,提供了C++/Java/Go/C#接口支持,这是一个注 ...
- 机器学习:线性回归法(Linear Regression)
# 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度R < 0,则说明很可能数据间不存在任何线性关系(也可能是算法中间出现错误),此时就要检查算法或者考虑使用其它算法: ...
- java代码继承。。。找出不能继承父类方法的问题
总结:当子类中没有定义name属性时,在子类的无参构造方法中,父类的姓名是不能被继承的. 输出的结果是,子类无参构造方法里的属性值,也就是是属 控制台显示: 我叫:周杰伦,今年:2岁我的姓名:周杰伦, ...
- Thread之三:Thread Join()的用法
一.join用法 join()和wait()不会释放锁,join()是Thread的方法,wait()是Object的方法 1.join方法定义在Thread类中,则调用者必须是一个线程 例如: Th ...
- 创建,查看,删除pool,查看,修改pool参数命令总结
标签(空格分隔): ceph,ceph运维,pool 1. 创建pool命令: ceph的pool有两种类型,一种是副本池,一种是ec池,创建时也有所区别 1.1 创建副本池: $ sudo ceph ...
- [0day]jQuery Mobile XSS
漏洞影响范围: 任何一个website使用了 jQuery Mobile 并且开放了重定向都有可能存在XSS,并且目前还没有相关补丁信息. 应用介绍: jQuery Mobile是jQuery 框架的 ...