在開發 Windows Forms 應用程式時,登入視窗是幾乎每個專案都會遇到的基礎功能。本文將分享一個完整的登入表單實作範例,涵蓋資料庫連線、使用者驗證、錯誤處理,以及父子視窗之間的資料傳遞機制。程式碼採用 C# 撰寫,適合初學者參考與延伸。
範例使用名為 users 的資料表,包含三個欄位:
預設資料如下:
| ID | UserName | UserPasswd |
|---|---|---|
| 1 | admin | admin |
| 2 | user | user |
| 3 | guest | guest |
驗證流程分為三個步驟:
IsUser 確認帳號是否存在Login 取得該帳號的密碼並比對表單包含兩個 Label(用戶名、密碼)、兩個 TextBox(輸入框,密碼欄設定 PasswordChar = '*')、兩個 Button(OK、Cancel)。表單屬性設定為 FixedDialog、不可最大化/最小化、不顯示在工作列。
private void btnOK_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtUser.Text))
{
MessageBox.Show("用戶名不能為空!", "錯誤");
return;
}
if (string.IsNullOrEmpty(txtPasswd.Text))
{
MessageBox.Show("密碼不能為空!", "錯誤");
return;
}
if (IsUser(txtUser.Text))
{
string dbPassword = LoginUser(txtUser.Text);
if (txtPasswd.Text == dbPassword)
{
this.DialogResult = DialogResult.OK;
Form2 owner = (Form2)this.Owner;
owner.getUserName = this.txtUser.Text;
}
else
{
MessageBox.Show("用戶名或密碼錯誤!");
}
}
else
{
MessageBox.Show("用戶名或密碼錯誤!");
}
}
使用 SqlConnection、SqlCommand 搭配預存程序,參數化查詢避免 SQL Injection:
private string LoginUser(string user)
{
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand("Login", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Name", user);
conn.Open();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0].Rows[0]["UserPasswd"].ToString();
}
}
}
Form2 為主程式進入點,建構子中以 ShowDialog(this) 開啟登入視窗,並將自己傳遞為 Owner。登入成功後,Form1 可透過 this.Owner 取得 Form2 實例,並設定公開屬性 getUserName 傳回登入帳號,供後續權限判斷使用。
app.config 或 appsettings.jsonawait cmd.ExecuteReaderAsync() 避免 UI 凍結完整專案程式碼可參考原文附件,包含 Form1、Form2 完整實作與資料庫腳本。