轉載自: http://blog.csdn.net/gatiememysql
Winform實現登陸窗體中記住密碼的功能,模仿QQ登陸記住密碼的實現
以下圖所示,其中標題部分由於項目保密的緣由,我加了馬賽克,請你們見諒。
用戶名輸入框咱們採用下拉列表框ComboBox
密碼框咱們採用textBox,並設置爲密碼框sql
設置textBox輸入時不顯示明文,須要將useSystemPasswordChar改成true,而後multiline設置爲false,而後從新生成一下就能夠了,由於textbox爲顯示爲密碼字符是當textbox爲單行編輯的時候,useSystemPasswordchar的設置纔會生效,而後咱們還能夠經過passwordChar設置textbox中以哪一種形式來顯示你輸入的字符,默認是」*」。數據庫
記住密碼功能的常見實現方法有三種:
方法一:寫入本地數據庫
方法二:寫入文件——txt、xml、ini
方法三:註冊表
咱們採用的方式是第二種,其找第二種方式最簡單便捷,所以咱們採用這種方式實現,主要思路。咱們將用戶的用戶名和密碼已鍵值對等方式存儲在文件中,若是用戶選擇了記住密碼,就將信息寫入文件,而在窗體加載的時候,咱們讀取文件中的內容便可。markdown
//要先將User類先設爲能夠序列化(即在類的前面加[Serializable]) [Serializable] public class User { //public User(string username, string password) //{ // this.userName = username; // this.passWord = password; //} private string userName; public string Username { get { return userName; } set { userName = value; } } private string passWord; public string Password { get { return passWord; } set { passWord = value; } } }
在窗體加載的時候,讀取文件信息,而且綁定到用戶名comboBox上async
private void Login_Load(object sender, EventArgs e) { // 讀取配置文件尋找記住的用戶名和密碼 FileStream fs = new FileStream("data.bin", FileMode.OpenOrCreate); if (fs.Length > 0) { BinaryFormatter bf = new BinaryFormatter(); users = bf.Deserialize(fs) as Dictionary<string, User>; foreach (User user in users.Values) { this.UserName.Items.Add(user.Username); } for (int i = 0; i < users.Count; i++) { if (this.UserName.Text != "") { if (users.ContainsKey(this.UserName.Text)) { this.PassWord.Text = users[this.UserName.Text].Password; this.RemeberPassword.Checked = true; } } } } fs.Close(); // 用戶名默認選中第一個 if (this.UserName.Items.Count > 0) { this.UserName.SelectedIndex = this.UserName.Items.Count - 1; } //item = (List<User>)bUser.GetAll(); //item = //this.UserName.DataSource = item; //this.UserName.DisplayMember = "Username"; }
當用戶選擇了用戶名時候,密碼框中顯示對應密碼ui
private void UserName_SelectedValueChanged(object sender, EventArgs e) { // 首先讀取記住密碼的配置文件 FileStream fs = new FileStream("data.bin", FileMode.OpenOrCreate); if (fs.Length > 0) { BinaryFormatter bf = new BinaryFormatter(); users = bf.Deserialize(fs) as Dictionary<string, User>; for (int i = 0; i < users.Count; i++) { if (this.UserName.Text != "") { if (users.ContainsKey(UserName.Text) && users[UserName.Text].Password != "") { this.PassWord.Text = users[UserName.Text].Password; this.RemeberPassword.Checked = true; } else { this.PassWord.Text = ""; this.RemeberPassword.Checked = false; } } } } fs.Close(); }
用戶點擊登陸時,記錄密碼或者用戶名信息this
private async void Submit_Click(object sender, EventArgs e) //登錄驗證 { string username = this.UserName.Text.Trim(); string password = this.PassWord.Text.Trim(); User user = new User(); FileStream fs = new FileStream("data.bin", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); user.Username = username; if (this.RemeberPassword.Checked) // 若是單擊了記住密碼的功能 { // 在文件中保存密碼 user.Password = password; } else { // 不在文件中保存密碼 user.Password = ""; } // 選在集合中是否存在用戶名 if (users.ContainsKey(user.Username)) { users.Remove(user.Username); } users.Add(user.Username, user); //要先將User類先設爲能夠序列化(即在類的前面加[Serializable]) bf.Serialize(fs, users); //user.Password = this.PassWord.Text; fs.Close(); /////// /////// 這裏填寫登陸的處理邏輯代碼 /////// }