从 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
}
我正在用 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());
}
}
}
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
}