0

我正在尝试为我的模块做一个简单的项目。我为我的程序制作了一个登录系统,其想法是在用户输入正确的详细信息并提交之前禁用菜单栏控件。到目前为止,这是我想出的主要形式:

    public void setControlDisabled()
    {
        fileToolStripMenuItem.Enabled = false;
        clientsToolStripMenuItem.Enabled = false;
        dVDsToolStripMenuItem.Enabled = false;
        windowsToolStripMenuItem.Enabled = false;
    }

    public void setControlEnabled()
    {
        this.fileToolStripMenuItem.Enabled = true;
        this.clientsToolStripMenuItem.Enabled = true;
        this.dVDsToolStripMenuItem.Enabled = true;
        this.windowsToolStripMenuItem.Enabled = true;
    }

以下代码在我的登录表单中以及其他代码中:

private void btnLogin_Click(object sender, EventArgs e)
{
            //other code
            Form1 form = new Form1();
            form.setControlEnabled();
}

禁用部分工作正常,即使我在它显示的 setControlEnabled 方法中放了一个小 MessageBox,但它没有启用菜单条。

PS。菜单条上的登录仍然启用。

4

2 回答 2

0

看起来好像您的 Form1 实例在本地范围内限定为您的 btnLogin_Click 方法,而不是全局实例。在 Class 声明中声明您的 Form1 实例,即:

public class Form2
    private Form1 form = new Form1();

    public Form2()
    {
        form.Show();
    }

    private void btnLogin_Click(object sender, EventArgs e)
    {
        form.setControlEnabled();
    }
}
于 2013-04-24T15:18:22.193 回答
0

这可能是因为您需要存储对表单的引用并使用它。不要重新创建表单,否则您正在与另一个实例交谈,该实例将启用其项目。如果你调用form.Show()你当前的代码,你会看到这个

以下是您可以如何处理此问题:

Form1 otherForm;
Form1 OtherForm
{
    get
    { 
         //If the form is requested but not created yet, create it
         if(otherForm == null) 
             otherForm = new Form1();
         return otherForm;
    }
}

private void btnLogin_Click(object sender, EventArgs e)
{
            //other code
            OtherForm.setControlEnabled();
}

该属性懒惰地处理表单的创建。如果它已经被创建,那么它只返回那个实例,否则它创建一个新实例并返回它。不过,它将保留此参考。因此,您将需要一个 clear 方法或一个 setter,以便您可以将其设置为 null 如果它已关闭并且您希望它完全删除。

于 2013-04-24T15:14:20.833 回答