【问题标题】:passing username to form but username returns null c#将用户名传递给表单,但用户名返回 null c#
【发布时间】:2013-01-08 09:04:39
【问题描述】:

此代码用于返回登录表单中文本框的值。

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. 用户需要点击修改密码链接,会出现修改密码表单。

因此,我需要将用户名从登录表单传递到更改密码表单才能使用更改密码功能。但是,我现在面临的问题是用户名没有从登录表单传递到更改密码表单。

【问题讨论】:

  • username 何时设置?我在 Login 表单中没有看到任何代码可以做到这一点。
  • "我的代码有什么问题吗?"是的,事实上,您将业务逻辑和 UI 混合在一起,这正是 winforms 迫使您做的事情。快速切换到 WPF,以免为时已晚! =)
  • @HighCore Winforms 不会强迫您这样做,只是它允许您这样做,而且太多人不会尝试将它们分开。当您尝试将它们分开时,这是很有可能的,而且不是那么难。
  • @OP 对于您编辑的问题,您需要在您最初发布的代码中删除登录的创建,而不是在代码中的任何地方。问题是你做了太多次,而不是它不应该出现在你的程序中。
  • @HighCore 也有可能将它与 WPF 混为一谈。虽然,它可以帮助您分离,并且渲染更精细。 WPF 是新项目的更好选择。

标签: c# winforms


【解决方案1】:

问题出在这条线:

Login login = new Login();

这是用Login 的新实例作为局部变量来遮蔽login 实例字段,因此您访问的是一个空白字段,而不是访问用户之前与之交互的Login。你可以删除上面的代码行。

【讨论】:

  • @user1779026 “不起作用”并没有任何意义。您需要描述正在发生的事情以及它与您期望发生的事情有何不同。
  • @user1779026 重要的是相关代码包含在问题本身中,而不是在链接的某些外部站点上。
  • @user1779026 您还没有说明何时/何地为用户实际填写的实例创建/显示Login 表单。显示的第一个和第四个代码 sn-ps 也不是真正相关的。您只需要弄清楚(此时)如何将正确的登录表单(或者实际上只是用户名结果)获取到更改传递表单。
【解决方案2】:

问题在于,使用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!");
       }
   }
}

【讨论】:

    【解决方案3】:

    在这两行之间,新的login 中的username 何时被设置?

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

    【讨论】:

    • 那么我如何调用第一个登录表单而不是创建一个新实例?
    • @user1779026 这在很大程度上取决于您未显示的代码,即您在哪里创建/显示填充的登录表单。
    【解决方案4】:

    您从不显示登录表单,您如何假设有人使用实际用户名设置 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;
           }
    

    【讨论】:

    • 假设他正在显示登录表单,因为他正在描述他正在与它交互并看到它在代码中填充的变量;他只是没有正确访问Login 的正确实例。
    • @Servy,可能是对的,但是为什么在只需要用户名的情况下传递表单,为什么(从维护的角度)分散处理密码和登录的代码?跨度>
    • @如果这是我正在从事的一个项目,或者如果这是一个代码审查,那么我会在设计和实现方面改变很多事情,但事实并非如此。他用非常具体的解决方案询问具体问题。您的更改将导致表单显示两次;要使一切都以这种方式工作,需要进行大量的重新工作。如果他在 codereview 上发帖,那么答案将完全不同。
    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 2016-05-20
    • 2017-05-16
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多