多种形式 C# - 无限循环
Multiple Forms C# - Infinite Loop
我有一个问题...我尝试使用 2 个表单(第二个 - administratorForm - 在我单击第一个 - loginForm 上的按钮后打开)。
在主窗体 (loginForm) 上,我做了这样的事情:
administratorForm administratorFormular = new administratorForm();
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrator")
{
administratorFormular.Show();
this.Hide();
}
然后,在第二种形式(administratorForm)上,我有这个:
loginForm loginFormular = new loginForm();
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
我在进入无限循环时收到错误消息(我想这是因为我声明了两种形式,一个是彼此)。我该如何解决?
任何帮助都将适用...
// L.E.:
登录表单:
public partial class loginForm : Form
{
administratorForm administratorFormular = new administratorForm();
public loginForm()
{
InitializeComponent();
}
private void loginButton_Click(object sender, EventArgs e)
{
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrat0r")
{
administratorFormular.Show();
this.Hide();
}
else if (usernameTextBox.Text == "player" && passwordTextBox.Text == "pl4yer")
{
}
else
{
MessageBox.Show("Wrong username or password!");
usernameTextBox.Text = "";
passwordTextBox.Text = "";
}
}
}
管理员表格:
public partial class administratorForm : Form
{
loginForm loginFormular = new loginForm();
public administratorForm()
{
InitializeComponent();
}
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
}
在定义 administratorForm
中,行
loginForm loginFormular = new loginForm();
创建一个永远不会被替换的 loginForm
的新实例。解决这个问题的一种可能性是在 administratorFormular
中将 loginFormular
声明为 public
,用 null
初始化它并添加
administratorFormular.loginFormular = this;
administratorFormular.Show();
this.Hide();
in loginButton_Click
in loginForm
为 administratorFormular
提供对所需 loginForm
.
的引用
而不是写loginFormular().Close();
写this.Hide();
然后创建其他形式的实例如果它是强制性的
创建第二个表单时需要传入对父表单的引用
loginForm loginFormular;
public administratorForm(loginForm form)
{
InitializeComponent();
loginFormular = form;
}
并根据需要调用它(在登录表单上)
new administratorForm(this);
实际上没有必要将其定义为登录表单的 属性。
注意:这仅在您确实需要父表单时出现,您显示的代码实际上根本没有使用它,如果是这样,只需删除第二个表单中对登录表单的任何引用。
目前,您的代码执行以下操作(如上面评论中所述):
您的 loginForm
实例创建 administratorForm
的实例,然后创建 loginForm
的实例,然后继续循环。
为避免这种情况,您可以在需要时创建 administratorForm
实例,并将 loginForm
的实例传递给新创建的 administartorForm
.
代码如下所示:
public partial class loginForm : Form
{
// administratorForm administratorFormular = new administratorForm();
public loginForm()
{
InitializeComponent();
}
private void loginButton_Click(object sender, EventArgs e)
{
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrat0r")
{
var administratorFormular = new administratorForm();
administratorFormular.loginFormular = this;
administratorFormular.Show();
this.Hide();
}
else if (usernameTextBox.Text == "player" && passwordTextBox.Text == "pl4yer")
{
}
else
{
MessageBox.Show("Wrong username or password!");
usernameTextBox.Text = "";
passwordTextBox.Text = "";
}
}
}
public partial class administratorForm : Form
{
// loginForm loginFormular = new loginForm();
public loginFormular LoginForm;
public administratorForm()
{
InitializeComponent();
}
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
}
我希望这对你有意义。
我目前无法对此进行测试,但有可能只 Close()
loginForm
而在 Show()
n 你的 [=12] 之后根本不通过它=].
在这种情况下,您不必将 loginForm
实例传递给 administratorForm 并调用 this.Close();
而不是 this.Hide();
,并删除 loginFormular.Close();
完全。
在您的 Program.cs Class WinForms 项目中:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LoginForm loginForm = new LoginForm();
DialogResult res = loginForm.ShowDialog();
if (res != DialogResult.OK)
return;
if (loginForm.MyEnumCode == 1)
{ //AdminForm
Application.Run(new AdminForm());
}
else if (loginForm.MyEnumCode == 2)
{ //PlayerForm
Application.Run(new PlayerForm());
}
}
}
这是登录表单代码:
public partial class LoginForm : Form
{
public int MyEnumCode = 0;
public LoginForm()
{
InitializeComponent();
}
private void btnOk_Click(object sender, EventArgs e)
{
if (textUser.Text == "administrator" && textPass.Text == "administrat0r")
{
MyEnumCode = 1;
this.DialogResult = DialogResult.OK;
}
else if (textUser.Text == "player" && textPass.Text == "pl4yer")
{
MyEnumCode = 2;
this.DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Wrong username or password!");
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
如果您将 this.DialogResult 设置为任何值,表单将自动关闭。然后你可以检查结果是否是你想要的结果(在我们的例子中它应该是 'OK')并从你的 loginForm 中获取 EnumCode。您应该使用 Enum 而不仅仅是 int,但 int 也可以正常工作。
我有一个问题...我尝试使用 2 个表单(第二个 - administratorForm - 在我单击第一个 - loginForm 上的按钮后打开)。 在主窗体 (loginForm) 上,我做了这样的事情:
administratorForm administratorFormular = new administratorForm();
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrator")
{
administratorFormular.Show();
this.Hide();
}
然后,在第二种形式(administratorForm)上,我有这个:
loginForm loginFormular = new loginForm();
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
我在进入无限循环时收到错误消息(我想这是因为我声明了两种形式,一个是彼此)。我该如何解决?
任何帮助都将适用...
// L.E.: 登录表单:
public partial class loginForm : Form
{
administratorForm administratorFormular = new administratorForm();
public loginForm()
{
InitializeComponent();
}
private void loginButton_Click(object sender, EventArgs e)
{
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrat0r")
{
administratorFormular.Show();
this.Hide();
}
else if (usernameTextBox.Text == "player" && passwordTextBox.Text == "pl4yer")
{
}
else
{
MessageBox.Show("Wrong username or password!");
usernameTextBox.Text = "";
passwordTextBox.Text = "";
}
}
}
管理员表格:
public partial class administratorForm : Form
{
loginForm loginFormular = new loginForm();
public administratorForm()
{
InitializeComponent();
}
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
}
在定义 administratorForm
中,行
loginForm loginFormular = new loginForm();
创建一个永远不会被替换的 loginForm
的新实例。解决这个问题的一种可能性是在 administratorFormular
中将 loginFormular
声明为 public
,用 null
初始化它并添加
administratorFormular.loginFormular = this;
administratorFormular.Show();
this.Hide();
in loginButton_Click
in loginForm
为 administratorFormular
提供对所需 loginForm
.
而不是写loginFormular().Close();
写this.Hide();
然后创建其他形式的实例如果它是强制性的
创建第二个表单时需要传入对父表单的引用
loginForm loginFormular;
public administratorForm(loginForm form)
{
InitializeComponent();
loginFormular = form;
}
并根据需要调用它(在登录表单上)
new administratorForm(this);
实际上没有必要将其定义为登录表单的 属性。
注意:这仅在您确实需要父表单时出现,您显示的代码实际上根本没有使用它,如果是这样,只需删除第二个表单中对登录表单的任何引用。
目前,您的代码执行以下操作(如上面评论中所述):
您的 loginForm
实例创建 administratorForm
的实例,然后创建 loginForm
的实例,然后继续循环。
为避免这种情况,您可以在需要时创建 administratorForm
实例,并将 loginForm
的实例传递给新创建的 administartorForm
.
代码如下所示:
public partial class loginForm : Form
{
// administratorForm administratorFormular = new administratorForm();
public loginForm()
{
InitializeComponent();
}
private void loginButton_Click(object sender, EventArgs e)
{
if (usernameTextBox.Text == "administrator" && passwordTextBox.Text == "administrat0r")
{
var administratorFormular = new administratorForm();
administratorFormular.loginFormular = this;
administratorFormular.Show();
this.Hide();
}
else if (usernameTextBox.Text == "player" && passwordTextBox.Text == "pl4yer")
{
}
else
{
MessageBox.Show("Wrong username or password!");
usernameTextBox.Text = "";
passwordTextBox.Text = "";
}
}
}
public partial class administratorForm : Form
{
// loginForm loginFormular = new loginForm();
public loginFormular LoginForm;
public administratorForm()
{
InitializeComponent();
}
private void exitButton_Click(object sender, EventArgs e)
{
loginFormular.Close();
}
}
我希望这对你有意义。
我目前无法对此进行测试,但有可能只 Close()
loginForm
而在 Show()
n 你的 [=12] 之后根本不通过它=].
在这种情况下,您不必将 loginForm
实例传递给 administratorForm 并调用 this.Close();
而不是 this.Hide();
,并删除 loginFormular.Close();
完全。
在您的 Program.cs Class WinForms 项目中:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LoginForm loginForm = new LoginForm();
DialogResult res = loginForm.ShowDialog();
if (res != DialogResult.OK)
return;
if (loginForm.MyEnumCode == 1)
{ //AdminForm
Application.Run(new AdminForm());
}
else if (loginForm.MyEnumCode == 2)
{ //PlayerForm
Application.Run(new PlayerForm());
}
}
}
这是登录表单代码:
public partial class LoginForm : Form
{
public int MyEnumCode = 0;
public LoginForm()
{
InitializeComponent();
}
private void btnOk_Click(object sender, EventArgs e)
{
if (textUser.Text == "administrator" && textPass.Text == "administrat0r")
{
MyEnumCode = 1;
this.DialogResult = DialogResult.OK;
}
else if (textUser.Text == "player" && textPass.Text == "pl4yer")
{
MyEnumCode = 2;
this.DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Wrong username or password!");
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
如果您将 this.DialogResult 设置为任何值,表单将自动关闭。然后你可以检查结果是否是你想要的结果(在我们的例子中它应该是 'OK')并从你的 loginForm 中获取 EnumCode。您应该使用 Enum 而不仅仅是 int,但 int 也可以正常工作。