2013-01-24 24 views
1

此代碼是返回登錄窗體中的文本框的值。傳遞用戶名形式,但用戶名返回空c#

public partial class Login : Form 
{ 
    public string returnUsername() 
    { 
     string username = textBox1.Text; 
     return username; 
    } 
} 

此代碼是爲了允許ChangePass窗體顯示。

public partial class Mainmenu_Employee : Form 
{ 
    private void changePasswd_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     this.Hide(); 
     Login login = new Login(); 
     ChangePass passwd = new ChangePass(login); 
     passwd.Show(); 
    } 
} 

此代碼是從登錄表單中獲取用戶名,以便我可以更改用戶名的密碼。

public partial class ChangePass : Form 
    { 
     Login login = null; //parent form 
     Mainmenu_Employee main = new Mainmenu_Employee(); 


     public ChangePass(Login login1) 
     { 
      InitializeComponent(); 
      login = login1; 
     } 

     private void buttonChangePass_Click(object sender, EventArgs e) 
     { 

      Model_DB_Employee emp = new Model_DB_Employee(); 
      //Login login = new Login(); 
      string username = login.returnUsername(); 


      if (textBoxNewPass.Text == string.Empty || textBoxConfirmPass.Text == string.Empty) 
      { 
       MessageBox.Show("Field cannot be empty!"); 
      } 
      else 
      { 
       if (textBoxNewPass.Text == textBoxConfirmPass.Text) 
       { 

        try 
        { 

         emp.changePasswd(username,textBoxConfirmPass.Text); 
         MessageBox.Show(username); 
         MessageBox.Show("Password updated!"); 
         this.Hide(); 
         main.Show(); 
        } 
        catch(SystemException ex) 
        { 
         MessageBox.Show("Password not updated" + ex); 
        } 

       } 
       else 
       { 
        MessageBox.Show("Passwords do not match!"); 
       } 
      } 
     } 

更改密碼功能:

public void changePasswd(string username, string newpass) //change password 
    { 
     Model_Employee emp = new Model_Employee(); 

     //Hasher hash = new Hasher(); //call hasher class for hashing 
     //string hashed; 
     //string salt = emp.generateSalt(); //generate random salt 
     //newpass = newpass + salt; //append salt to newpass 
     //hashed = hash.encryption(newpass); //hash newpass 


     for (int i = 0; i < rows.Count; ++i) 
     { 

      if ((string)empTab.Rows[i]["username"] == username)//check if ID matches 
      { 
       empTab.Rows[i]["passwd"] = newpass; //set passwd to hash new password     

       //check if dataset has changes 
       if (dataset.HasChanges()) 
       { 
        //update database 
        dbAdapter.Update(dataset, "employee"); 
        MessageBox.Show("Employee Updated!"); 
        refreshTable(); 

       } 
       else 
       { 
        refreshTable(); 
       } 
      } 
     } 

    } 

我想,當他登錄到更改用戶的密碼

  1. 當他登錄時,我想捕捉他的用戶名。通過一個文本框。

  2. 登錄後會顯示主菜單。

  3. 用戶需要點擊更改密碼鏈接,會出現更改密碼錶單。

因此,我需要將用戶名從登錄表單傳遞到更改密碼錶單以便使用更改密碼功能。但是,我現在面臨的問題是,用戶名不會從登錄表單傳遞到更改密碼錶單。

+0

什麼時候'username'被置?我在'Login'表單中看不到任何代碼。 – Jodrell

+0

「我的代碼有什麼問題嗎?」是的,你將所有業務邏輯和UI混合在一起,這是winforms強制你做的事情。很快,切換到WPF太遲了! =) –

+3

@HighCore Winforms不會強迫你這樣做,它只是允許你,而且太多人不會嘗試將它們分開。當你嘗試將它們分開時,這很有可能,而不是那麼困難。 – Servy

回答

3

的問題是該行:

Login login = new Login(); 

這與Login一個新實例陰影的login實例字段作爲一個局部變量,因此而不是訪問此前表示,用戶與互動創造了Login,你正在訪問一個空白的。您可以刪除上面的代碼行。

+0

編輯我的代碼 – user1779026

+0

比我快更多+1 – Jodrell

+0

是的,我已經刪除了該行,但它仍然不起作用 – user1779026

1

問題是,與Login login = new Login()你陰影你的類實例變量login。嘗試:

private void buttonChangePass_Click(object sender, EventArgs e) 
{ 
    Model_DB_Employee emp = new Model_DB_Employee(); 
    string username = login.returnUsername(); 

    if (textBoxNewPass.Text == string.Empty || textBoxConfirmPass.Text == string.Empty) 
    { 
     MessageBox.Show("Field cannot be empty!"); 
    } 
    else 
    { 
     if (textBoxNewPass.Text == textBoxConfirmPass.Text) 
     { 
      try 
      { 
       emp.changePasswd(username,textBoxConfirmPass.Text); 
       MessageBox.Show(username); 
       MessageBox.Show("Password updated!"); 
       this.Hide(); 
       main.Show(); 
      } 
      catch(SystemException ex) 
      { 
       MessageBox.Show("Password not updated" + ex); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Passwords do not match!"); 
     } 
    } 
} 
1

時,這兩條線之間,確實在新loginusername被置?

Login login = new Login(); 
string username = login.returnUsername(); 
+0

那我該如何調用第一個登錄表單而不是創建一個新的實例呢? – user1779026

+0

@ user1779026這很大程度上取決於您未顯示的代碼,即您在何處創建/顯示填充的登錄表單。 – Servy

0

您從不顯示登錄表單,您如何設想有人用實際用戶名設置textBox1?

你需要像這樣

 string username = string.Empty; 
     Model_DB_Employee emp = new Model_DB_Employee(); 
     using(Login login = new Login()) 
     {  
      if(DialogResult.OK == login.ShowDialog()) 
       username = login.returnUsername(); 
     } 
     if(username == string.Empty) 
     { 
      MessageBox.Show("Username required"); 
      return; 
     } 
+0

假設他正在顯示登錄表單,因爲他描述了他正在與之交互並查看它在代碼中填充的變量;他只是沒有正確地訪問正確的'Login'實例。 – Servy

+0

@Servy,可能是正確的,但爲什麼只在需要用戶名的時候傳遞一個表單,以及爲什麼(從維護的角度來看)以這種方式分散處理密碼和登錄的代碼? – Steve

+0

@如果這是我正在開發的一個項目,或者如果這是一個代碼審查,那麼我會在設計和實現方面改變很多事情,但事實並非如此。他用特定的解決方案詢問具體問題。您的更改將導致表單顯示兩次;這將需要大量的重新工作才能使所有的工作都以這種方式進行。如果他在codereview上發帖,那麼答案將完全不同。 – Servy