从 object C# 中调用初始 class

Calling the initial class from inside an object C#

我正在用 C# 创建一个 Windows 表单应用程序,我正在强制执行密码保护。 对于糟糕的标题和解释,我很抱歉,你可以看出我是一个业余爱好者。

登录时加载的表单是从 Program.cs

中调用的 class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace POS
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Login());
        }
    }
}

class简称为登录。用户成功通过身份验证后,我创建一个 class 的新 object,隐藏登录表单并打开一个新的 class.

namespace POS
{
    public partial class Login : Form
    {
        RiverbankTeaRooms main = new RiverbankTeaRooms();
        private void Enter_Click(object sender, EventArgs e)
        {
            bool found = false;
            try
            {
                // Search through database through dr[1] (Table 2) for matching string.
                foreach (DataRow dr in dra)
                {
                    if (dr[1].ToString() == Code.Text)
                    {
                        found = true;

                        // Open main form.
                        main.SignedIn = true;
                        main.Show();
                        this.Hide();
                        break;
                     }
                }
                if (found == false)
                {
                    // Incorrect password.

                    Code.Text = "Incor";
                }
            }
            catch
            {
                // Error, most likely with Database.
                Code.Text = "Error";
            }
        }
    }
}

这工作得很好...要打开程序并对用户进行身份验证,但是我希望能够从 RiverbankTeaRooms class 中注销并再次打开登录表单。我不知道如何才能再次 re-open 表单登录,因为它只是被隐藏了,但我不知道该怎么做 Login.Show(); 我无法在主表单中创建新的登录实例,因为 RiverbankTeaRooms 表单将无法关闭。

这让我发疯,对于糟糕的解释深表歉意!

要回答标题问题,只需将 Login 实例传递给 RiverbankTeaRooms object:

RiverbankTeaRooms main = new RiverbankTeaRooms(this);

//In other form
Login myPrivateLoginReference;
public RiverBanksTeaRoom(Login loginForm)
{
   myPrivateLoginReference = loginForm;
}

对于您的具体情况,还有其他方法,例如从 main 引发事件也可以:

main.ShowLoginRequested += ShowLogin;

void ShowLogin()
{
   this.Show();
}

顺便说一句,请 永远不要 将密码作为明文存储在数据库中,就像你所做的那样,你应该始终与哈希进行比较。

我想建议你改变程序的流程。

成功时不显示 Login 中的 RiverbankTeaRooms,而是在 Program.Main 中测试登录结果,然后显示 RiverbankTeaRooms 或任何错误消息。

将以下内容添加到登录:

    public bool Success { get; private set; }

    public static bool Authenticate()
    {
        var login = new Login();
        login.ShowDialog();

        return login.Success;
    }

并更新您的 Enter_Click :

    private void Enter_Click(object sender, EventArgs e)
    {
        try
        {
            // Search through database through dr[1] (Table 2) for matching string.
            foreach (DataRow dr in dra)
            {
                if (dr[1].ToString() == Code.Text)
                {
                    Success = true;
                    break;
                }
            }
            if (!Success)
            {
                // Incorrect password.
                Code.Text = "Incor";
            }
            else
            {
                this.Close();
            }
        }
        catch
        {
            // Error, most likely with Database.
            Code.Text = "Error";
        }
    }
}

并且只需使用 Authenticate 方法:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new RiverbankTeaRooms() { SignedIn = Login.Authenticate() });
}

如果您需要在 RiverbankTeaRooms 中再次进行身份验证,您可以这样做:

if (Login.Authenticate())
{
    // do stuff...
}
else
{
    // show error, or stop the user
}