上次我們說了默認登錄名和登錄密碼的登陸窗體,下面我們來看看和數據庫連接起來的登陸窗體。
這次我們要先做好一個數據庫,再起中創建兩張表,①一張方用戶登陸信息;②另一張是我們要傳到主窗體上的表。我們要做的就是通過與數據庫的連接,判斷用戶輸入的登錄名和登錄密碼是否正確,正確的話,把登錄名傳到主窗體中,再把我們做好的另一張表的信息顯示在主窗體上。
先來看看我們的登錄窗體中是怎麼寫的:
//聲明一個委託,並將登錄名傳進去,用來傳值 public delegate void SendLoginIdHandler(string loginId); public partial class frmLogin : Form { //定義一個事件 public event SendLoginIdHandler SendLoginIdEvent; public frmLogin() { InitializeComponent(); } //定義一個狀態變量 bool flag = false; /// <summary> /// 確定按鈕的Click事件,我們要通過點擊確定按鈕, /// 來觸發這個事件,並判斷輸入的用戶名和密碼是否正確 /// 這次我們是通過連接上數據庫來判斷,事先在數據庫中填好 /// 用戶信息,查找並判斷 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOk_Click(object sender, EventArgs e) { //取值 string loginId = this.txtLoginId.Text; string loginPwd = this.txtLoginPwd.Text; //通過調用函數來判斷輸入的信息是否正確 bool b = checkLogin(loginId,loginPwd); if (b) { //輸入正確的話,我們就判斷事件是否爲空,如果不是空的話,就激發這個事件 if (SendLoginIdEvent != null) { //激發事件 SendLoginIdEvent(loginId); } //輸入正確,將狀態變量設爲true flag = true; //關閉登錄窗體 this.Close(); } else { //如果登陸不成功的話,將狀態變量設置爲false flag = false; //並顯示一個提示框,提示登陸失敗 MessageBox.Show("登錄名或密碼錯誤","登錄提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } /// <summary> /// 判斷登陸 /// 在這裏面連接上數據庫,並把用戶輸入的值與數據庫中的值比較,並返回比較的結果 /// </summary> /// <param name="loginId">用戶輸入的登錄名</param> /// <param name="loginPwd">用戶輸入的登陸密碼</param> /// <returns></returns> private bool checkLogin(string loginId, string loginPwd) { string sql = "select *from Users where loginId=@loginId And loginPwd=@loginPwd"; string connString = "server=.\\sqlexpress;uid=sa;pwd=199298;database=SchoolDB"; SqlConnection connection = new SqlConnection(connString); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = sql; SqlParameter p1 = new SqlParameter("@loginId", loginId); SqlParameter p2 = new SqlParameter("loginPwd", loginPwd); cmd.Parameters.Add(p1); cmd.Parameters.Add(p2); connection.Open(); SqlDataReader sdr = cmd.ExecuteReader(); bool result = sdr.Read(); connection.Close(); return result; } //如果登錄失敗,就關閉應用程序 private void frmLogin_FormClosing(object sender, FormClosingEventArgs e) { if (flag==false) { Application.Exit(); } } }
再來看看主窗體中的寫法:
public partial class frmMain : Form { public frmMain() { InitializeComponent(); } /// <summary> /// 主窗體的加載事件,在這個窗體顯示之前最後一個被觸發的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmMain_Load(object sender, EventArgs e) { //創建一個frmLogin對象,在主窗體顯示之前先顯示登錄窗體。 frmLogin frm = new frmLogin(); //訂閱委託事件 frm.SendLoginIdEvent += new SendLoginIdHandler(frm_SendLoginIdEvent); //將登錄窗體顯示出來 frm.ShowDialog(); //填充主窗體中的ListView控件 FillListView(); } //在事件被激發以後,將登錄名傳到主窗體中 void frm_SendLoginIdEvent(string loginId) { this.label1.Text = loginId; } /// <summary> /// 填充控件,在登陸成功之後,顯示主窗體的時候將控件填充 /// </summary> private void FillListView() { //SQL語句 string sql = "select*from Students"; //連接字符串 string connString = "server=.\\sqlexpress;uid=sa;pwd=199298;database=SchoolDB"; //創建一個連接對象,將連接字符串傳進去 SqlConnection connection = new SqlConnection(connString); //創建一個命令對象 SqlCommand cmd = connection.CreateCommand(); //將SQL語句給命令對象 cmd.CommandText = sql; //創建一個數據表對象 DataTable dt = new DataTable(); //填充一個數據庫命令和數據庫連接 SqlDataAdapter sda = new SqlDataAdapter(cmd); //填充數據表對象 sda.Fill(dt); //遍歷數據數據表中的每一行 foreach (DataRow row in dt.Rows) { //取值,將遍歷到的每一行的值分別給對應的字段 int id = (int)row["id"]; string name = (string)row["name"]; string cardId = (string)row["cardId"]; string phone = (string)row["phone"]; string qq = (string)row["qq"]; //創建一個ListViewItem對象,將得到的數據放到控件的每一列中去 ListViewItem lvi = new ListViewItem(); //填充值 lvi.Text = id.ToString(); lvi.SubItems.Add(name); lvi.SubItems.Add(cardId); lvi.SubItems.Add(phone); lvi.SubItems.Add(qq); //將創建的這個對象的值加到控件中去 this.listView.Items.Add(lvi); } } }
看看登陸成功後主窗體中是怎麼顯示的:
通過這個登陸窗體,我們就能看到在登陸以後我們可以在主窗體中做我們想做的事,還可以很好的與數據庫聯繫起來,讓他們之間可以交流。
加油!!!!