从对象C#中调用初始类

时间:2015-01-05 18:52:14

标签: c# winforms

我正在用C#创建一个Windows窗体应用程序,我正在实施密码保护。 我很抱歉这个糟糕的头衔和解释,因为你可以说我是一个业余爱好者。

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

中调用的类
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());
        }
    }
}

该类简称为Login。一旦用户成功通过身份验证,我就会创建一个类的新对象,隐藏Login表单并打开一个新类。

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类中再次注销并打开登录表单。我不知道我怎么能再次重新打开表单登录,因为它只是隐藏了,但我无法弄清楚如何做Login.Show(); 我无法在主窗体中创建新的登录实例,因为RiverbankTeaRooms窗体无法关闭。

这让我发疯了,对不起的解释感到抱歉!

2 个答案:

答案 0 :(得分:3)

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

不是在RiverbankTeaRooms成功时显示Login,而是在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
}

答案 1 :(得分:2)

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

RiverbankTeaRooms main = new RiverbankTeaRooms(this);

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

对于您的具体情况,还有其他方法,例如从main提出一个也可以起作用的事件:

main.ShowLoginRequested += ShowLogin;

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

顺便说一句,请从不将密码作为纯文本存储在数据库中,就像您正在做的那样,您应该始终与哈希进行比较。