从C#WinForm中的Toolstrip菜单项和UserControl按钮登录

从C#WinForm中的Toolstrip菜单项和UserControl按钮登录,c#,login,C#,Login,我想不出解决办法 以下是简要描述 我有一个名为“frmMain”的主窗体,它有一个MenuStrip,其中包含一个名为“mnuFile”的ToolStripMenuItem,它还包含一个名为“mnuLogIn”的ToolStripMenuItem 同时,主窗体还包含一个名为“panel2”的面板,当窗体加载时,该面板将保存名为“uc_MainMenu”的usercontrol实例。 该用户控件有几个按钮,其中一个是名为“btnLogIn”的按钮 其结构是,如果用户从“mnuLogIn”或“btn

我想不出解决办法

以下是简要描述

我有一个名为“frmMain”的主窗体,它有一个MenuStrip,其中包含一个名为“mnuFile”的ToolStripMenuItem,它还包含一个名为“mnuLogIn”的ToolStripMenuItem

同时,主窗体还包含一个名为“panel2”的面板,当窗体加载时,该面板将保存名为“uc_MainMenu”的usercontrol实例。 该用户控件有几个按钮,其中一个是名为“btnLogIn”的按钮

其结构是,如果用户从“mnuLogIn”或“btnLogIn”输入正确的用户名和密码,我希望用户能够登录。 单击其中一个按钮时,“frmLogIn”将出现

登录成功后,“mnuLogIn”或“btnLogIn”都会将其文本从“登录”更改为“注销”

我在主窗体中编写了登录方法,如下所示

    internal void mnuLogIn_Click(object sender, EventArgs e)
    {
          ShowLogIn();

    }


    internal void ShowLogIn()
    {

        if (this.mnuLogIn.Text == "LogOut" )
        {
            if (MessageBox.Show("Are you sure you want to LogOut?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                 mnuLogIn.Text = "LogIn";
                 ShowMenu("");
                 obj_uc_MainMenu.Log_Out_Button = new Button();        
            }
            return;
       }


        frmLogin obj_frmLogin = new frmLogin();


        //followed by checking the username and password 
        //the procedure repeated until the log-in is successful

        mnuLogIn.Text = "LogOut";

        obj_uc_MainMenu.Log_In_Button = new Button();      
   }
在用户控件“uc_主菜单”中

运行此代码

1) “mnuLogIn”登录

当我尝试通过“mnuLogIn”按钮登录时,一切正常。obj_uc_主菜单中的“mnuLogIn”和“btnLogIn”都将其文本从“登录”更改为“注销”

2) “btnLogIn”登录

当我试图通过“btnLogIn”按钮登录时,“frmLogin”出现了。它在检查用户名和密码的步骤中非常有效。但在我点击“frmLogin”对话框中的登录按钮后,什么也没发生。“mnuLogIn”和“btnLogIn”都没有改变他们的文本

发生了什么事


哦,我忘了提到,“frmLogin”中登录按钮的对话框结果已设置为OK。因此,“frmLogin”中没有代码。我建议您将代码更改为这种方法

// This should be public to be callable from the usercontrol
public void ShowLogIn()
{
    if (this.mnuLogIn.Text == "LogOut" )
    {
        if (MessageBox.Show("Are you sure you want to LogOut?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
             mnuLogIn.Text = "LogIn";
             ShowMenu("");

             // Call the user control to adjust its internal status
             obj_uc_MainMenu.SetLoginStatus();
        }
   }
   else
   {
       using(frmLogin obj_frmLogin = new frmLogin())
       {
            if(obj_frmLogin.ShowDialog() == DialogResult.OK)
            {
               // Check the username and password and if everythin ok then

               mnuLogIn.Text = "LogOut";
               // Again call the usercontrol to adjust its status
               obj_uc_MainMenu.SetLogoutStatus()
           }
       }
    }
}


public void SetLoginStatus()
{
    btnLogIn.Text = "LOGIN"; 
}
public void SetLogoutStatusStatus()
{
    btnLogIn.Text = "LOGOUT"; 
}
private void btnLogIn_Click(object sender, EventArgs e)
{
    // Get the current instance of frmMain from the OpenForms collection
    frmMain obj_frmMain = Application.OpenForms.OfType<frmMain>();           

    // Should not be required, but better to be safe....
    if(obj_frmMain != null) 
       // Call the public method to run the login process
       obj_frmMain.ShowLogin();
}
//这应该是公共的,可以从usercontrol调用
public void ShowLogIn()
{
如果(this.mnuLogIn.Text==“注销”)
{
if(MessageBox.Show(“您确定要注销吗?”,“确认”,MessageBoxButtons.YesNo)=DialogResult.Yes)
{
mnuLogIn.Text=“登录”;
显示菜单(“”);
//调用用户控件以调整其内部状态
obj_uc_main menu.SetLoginStatus();
}
}
其他的
{
使用(frmLogin obj_frmLogin=new frmLogin())
{
if(obj_frmLogin.ShowDialog()==DialogResult.OK)
{
//检查用户名和密码,如果一切正常,则
mnuLogIn.Text=“注销”;
//再次调用usercontrol以调整其状态
obj_uc_主菜单。SetLogoutStatus()
}
}
}
}
public void SetLoginStatus()
{
btnLogIn.Text=“登录”;
}
public void SetLogoutStatusStatus()
{
btnLogIn.Text=“注销”;
}
私有void btnLogIn\u单击(对象发送方,事件参数e)
{
//从OpenForms集合获取frmMain的当前实例
frmMain obj_frmMain=Application.OpenForms.OfType();
//不应该被要求,但最好是安全的。。。。
if(obj_frmMain!=null)
//调用public方法来运行登录过程
obj_frmMain.ShowLogin();
}

经典问题。您调用新frmMain,然后对该实例执行操作。您没有更改屏幕上已经存在的frmMain实例,而是您刚刚创建的实例,并且该实例从未显示。为了更好地理解这里发生的事情,请尝试添加obj_frmMain.Show();调用obj_frmMain.mnuLogIn_后,单击(发件人,e);在用户控件按钮内部单击事件handler@Steve哦,我明白了!有没有办法显示这些变化?我不能向主窗体声明static,因为它是从“form”派生的类。
// This should be public to be callable from the usercontrol
public void ShowLogIn()
{
    if (this.mnuLogIn.Text == "LogOut" )
    {
        if (MessageBox.Show("Are you sure you want to LogOut?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
             mnuLogIn.Text = "LogIn";
             ShowMenu("");

             // Call the user control to adjust its internal status
             obj_uc_MainMenu.SetLoginStatus();
        }
   }
   else
   {
       using(frmLogin obj_frmLogin = new frmLogin())
       {
            if(obj_frmLogin.ShowDialog() == DialogResult.OK)
            {
               // Check the username and password and if everythin ok then

               mnuLogIn.Text = "LogOut";
               // Again call the usercontrol to adjust its status
               obj_uc_MainMenu.SetLogoutStatus()
           }
       }
    }
}


public void SetLoginStatus()
{
    btnLogIn.Text = "LOGIN"; 
}
public void SetLogoutStatusStatus()
{
    btnLogIn.Text = "LOGOUT"; 
}
private void btnLogIn_Click(object sender, EventArgs e)
{
    // Get the current instance of frmMain from the OpenForms collection
    frmMain obj_frmMain = Application.OpenForms.OfType<frmMain>();           

    // Should not be required, but better to be safe....
    if(obj_frmMain != null) 
       // Call the public method to run the login process
       obj_frmMain.ShowLogin();
}