我正在用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
窗体无法关闭。
这让我发疯了,对不起的解释感到抱歉!
答案 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();
}
顺便说一句,请从不将密码作为纯文本存储在数据库中,就像您正在做的那样,您应该始终与哈希进行比较。