多个表单C# - 无限循环

时间:2016-02-11 09:25:12

标签: 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();
    }
}

5 个答案:

答案 0 :(得分:0)

在定义administratorForm中,行

loginForm loginFormular = new loginForm();

创建一个永不替换的loginForm新实例。解决此问题的一种可能方法是在loginFormular中将public声明为administratorFormular,使用null对其进行初始化并添加

administratorFormular.loginFormular = this;
administratorFormular.Show();
this.Hide();
<{1}}中的loginButton_Click中的

,为loginForm提供对所需administratorFormular的引用。

答案 1 :(得分:0)

而不是写loginFormular().Close();this.Hide();然后创建其他形式的实例(如果它是强制的)

答案 2 :(得分:0)

创建第二个表单时需要传入对父表单的引用

loginForm loginFormular;

public administratorForm(loginForm form)
{
    InitializeComponent();
    loginFormular = form;
}

并根据需要(在登录表单上)使用

进行调用
new administratorForm(this);

实际上没有必要将其定义为登录表单的属性。

注意:这只是在您确实需要父表单的情况下,您显示的代码实际上根本不使用它,如果是这样,只需删除对第二种表单中的登录表单的任何引用。

答案 3 :(得分:0)

目前,您的代码执行以下操作(如上面的评论中所述): 您的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 administratorForm loginForm之后根本无法通过this.Close();

在这种情况下,您不必将this.Hide();实例传递给administratorForm并调用loginFormular.Close();而不是{{1}},并完全删除{{1}}。

答案 4 :(得分:0)

在WinForms项目的Program.cs类中:

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());
        }

    }
}

这是LoginForm代码:

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设置为任何值,Form将自动关闭。然后,您可以检查结果是否是您想要的结果(在我们的例子中,它应该是&#39; OK&#39;)并从您的loginForm获取EnumCode。你应该使用一个枚举而不仅仅是一个int,但int也能正常工作。