zoukankan      html  css  js  c++  java
  • C#学习笔记之Winform登录注册

    登录需求很常见,不管BS项目还是CS项目,你几乎都需要一个登录界面来开启你的项目。登录时通过查询验证数据库的用户名和密码,来判断是否登录成功。那么一个完整的登录过程需要有哪几步呢?

    1,登录界面(Login):

          两个Lable控件: 用户名  和  密码

          对应两个Lable有用户名框和密码框两个TextBox控件:  accountTextBox,passwordTextBox ,

          三个Button控件:登录(loginBouttom),注册(registeredButton),关闭(closeBouttom)

          Check控件:在密码框后面,是否显示密码(visibilityCheck)

    2,注册界面(Registered)

          三个Lable控件: 用户名  ,  密码 和 重复密码

          对应三个个Lable有用户名框和密码框三个TextBox控件:  accountTextBox,passwordTextBox ,repeatPasswordTextBox 

          两个Button控件:注册(registeredButton),关闭(closeBouttom)

    3,用到的工具类和静态类(前两个类我都专门写在一篇博客,这里就不上代码了)

          XmlToolClass:XML工具类  保存琐细的数据,比如记录最后一次成功登录的账号,没必要因为存一个账号而在数据库新建一个表。

          SqlHelpClass:简化对数据库的操作

          LoginInfo:用户类,应用单件模式,保存用户登录状态

    LoginInfo类代码:

     /// <summary>
        /// 用户类
        /// </summary>
        public class LoginInfo
        {
            //用户帐号,登录帐号
            private string _Account = "";
            public string Account { get { return _Account; } set { _Account = value; } }
    
    
            //用户名
            private string _PassWord = "";
            public string PassWord { get { return _PassWord; } set { _PassWord = value; } }
    
    
            //登录时间
            private DateTime _LoginTime;
            public DateTime LoginTime { get { return _LoginTime; } set { _LoginTime = value; } }
    
    
            private static LoginInfo _CurrentUser = null;
    
    
            //应用单件模式,保存用户登录状态
            public static LoginInfo CurrentUser
            {
                get
                {
                    if (_CurrentUser == null)
                        _CurrentUser = new LoginInfo();
                    return _CurrentUser;
                }
            }
        }
    View Code

    4,注册

         注册的话数据库需要一个表

        

    create table usersTable
    
       (
    
            accout  char(20) primary key,
    
            password char(20) not null 
    
       )

         账号是主键,不能重复,密码这里不为空就行,实际需要给个最小长度,这个最小长度不一定需要在数据库加check,也可以在注册的检测代码里校对。

    5,登录

       就是对数据库的查询

       首先两个textbox上的数据是否符合==>   查询账号是否存在==>查询密码是否正确

       登录成功后,需要把数据记录在LoginInfo里面,不然一点击登录这些数据就拿不到了。

    接下来分别把各个步骤的代码上一遍

      Login窗口是该实例的主窗口

       Windows窗体文件(From窗口)类文件里尽量不要写太多关于逻辑控制和数据操作的代码,小练习MVC框架用不上,但是MVC的编程思想要有,即使是在做一个很小的程序。

       

    public partial class login : Form
        {
            public bool IsClose { get; set; }
    
            public login()
            {
                
                InitializeComponent();
                AccoutTextBox.Text = XmlToolClass.GetLastTimeSuccessfulLoginAccount("账号");
                PasswordTextBox.PasswordChar = '*';//设置显示*隐藏密码
                IsClose = false;
                //利用XmlToolClass从xml文件中获取最后一次成功登录的账号
    
            }
    
            private void registeredButton_Click_1(object sender, EventArgs e)
            {
                Registered registered = new Registered();          
               
                this.Hide();//隐藏当前窗口
                registered.ShowDialog();//显示注册窗口
                
            }
           
            private void visibilityCheck_CheckedChanged(object sender, EventArgs e)
            {
               
                if (visibilityCheck.Checked)
                {
                    PasswordTextBox.PasswordChar = new char();//设置密码可见
                }
                else
                {
                    PasswordTextBox.PasswordChar = '*';//设置显示*隐藏密码
                }
            }
    
         
    
            private void loginBoutton_Click(object sender, EventArgs e)
            {
                string strSqlAccout = "select count(*) from usersTable where accout='" + AccoutTextBox.Text.Trim() + "'";
                string strSqlPassword = "select count(*) from usersTable where accout='" + AccoutTextBox.Text.Trim() +
                    "' and password='" + PasswordTextBox.Text + "'";
                if (AccoutTextBox.Text == "" || PasswordTextBox.Text == "")
                    MessageBox.Show("账号和密码不能为空!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else if (Convert.ToInt16( SqlHelpClass.ExecuteScalar(strSqlAccout)) <= 0)
                    //利用SqlHelpClass查询账号
                    MessageBox.Show("账号不存在!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else if (Convert.ToInt16(SqlHelpClass.ExecuteScalar(strSqlPassword)) <= 0)
                    //利用SqlHelpClass验证密码
                    MessageBox.Show("密码错误!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else
                {
                    //LoginInfo为静态类,登陆成功后此静态类用于存储账号,用户名,登陆时间
                    LoginInfo.CurrentUser.Account = AccoutTextBox.Text;
                    LoginInfo.CurrentUser.PassWord = PasswordTextBox.Text;
                    LoginInfo.CurrentUser.LoginTime = DateTime.Now;
                    XmlToolClass.SetSuccessfulLoginAccount("账号", LoginInfo.CurrentUser.Account);//将账号写入xml
                    this.DialogResult = DialogResult.OK;
    
                }
            }
    
            private void closeButton_Click(object sender, EventArgs e)
            {
                IsClose = true;
                this.Close();
            }
        }
    View Code

       Registered窗口类

     public partial class Registered : Form
        {
            
           
            public Registered()
            {
               
                InitializeComponent();
            }
            
            private void closButton_Click(object sender, EventArgs e)
            {
    
                this.Close();
    
            }
    
            private void registeredButton_Click(object sender, EventArgs e)
            {
                string strSqlAccout = "select count(*) from usersTable where accout='" + accountTextBox.Text.Trim() + "'";
               
                if (accountTextBox.Text == "" || accountTextBox.Text == "")
                    MessageBox.Show("账号和密码不能为空!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else if ( int.Parse(SqlHelpClass.ExecuteScalar(strSqlAccout).ToString()) > 0)
                    //利用SqlHelpClass查询账号
                    MessageBox.Show("账号已存在!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else if (passwordTextBox.Text!=repeatPassword.Text)
                    //利用SqlHelpClass验证密码
                    MessageBox.Show("两次密码不相同!", "登陆提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
                else
                {
                    try
                    {
                        if (SqlHelpClass.AddData("usersTable", accountTextBox.Text, passwordTextBox.Text) > 0)
                            MessageBox.Show("注册成功");
                        else
                            MessageBox.Show("注册失败,请重新注册");
                    }
                    catch { }
                }
            }
    
           
        }

      最后就是测试,新建一个主页窗口(Home),模拟登陆成功后,跳转的窗口。

       有两个Label控件,用来显示登陆时数据。

       上面Login的代码到最后面登陆为什么不跳转窗口反而是来一段 this.DialogResult = DialogResult.OK;,有一些人看不懂。

        如果以Login为主窗口的话,那么正常的操作应该是,先隐藏Login窗口个在实例化一个Home窗口,然后使得Home窗口可见。我们不能关闭Login,因为关闭主窗口,整个应用程序就直接退出了。

        所以我们需要做一些改动,使得Login窗口变成在主窗口弹出前的一个判断性质的窗口——模式对话框。   

        模式对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。

        我们对Program类的main方法做些改变,main方法是应用程序的主入口点。

       

    static class Program
        {
    
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                login login1;
                do //模式窗口之间循环,直到密码正确
                {
                    login1 = new login();//实例化Login
                    login1.ShowDialog();//将Login实例窗体显示为模式对话框
                    if (login1.IsClose)
                        break;
    
                } while (!login1.DialogResult.Equals(DialogResult.OK));//登录成功才显示主窗体
    
                if(login1.DialogResult.Equals(DialogResult.OK))
                  Application.Run(new Home());// Application.Run()方法运行主窗口
    
    
            }
        }

               这里用到了一个do while循环,因为注册窗口也是模式对话框,对于两个模式对话框之间切换,我只能说能力有限。基于两个模式对话框相互操作和切换太难,只能重复关闭窗口,实例化窗口,来维持

    登录界面与注册界面直至登录成功或者退出,因为do while 循环 所以只能添加一个IsClose布尔值属性来判断是否终止循环来退出。

     

         

  • 相关阅读:
    力扣Leetcode 3. 无重复字符的最长子串
    力扣Leetcode 21. 合并两个有序链表
    力扣Leetcode 202. 快乐数 -快慢指针 快乐就完事了
    力扣Leetcode 面试题56
    力扣Leetcode 33. 搜索旋转排序数组
    力扣Leetcode 46. 全排列
    python123期末四题编程题 -无空隙回声输出-文件关键行数-字典翻转输出-《沉默的羔羊》之最多单词
    深入理解ReentrantLock的实现原理
    深入图解AQS实现原理和源码分析
    Java:CAS(乐观锁)
  • 原文地址:https://www.cnblogs.com/xwzLoveCshap/p/11529884.html
Copyright © 2011-2022 走看看