我想从Form2控制Form1。

5

我希望用户先登录才能使用其他表单。但是我的困境在于,登录框在Form2中,而主表单在Form1中。

if ((struseremail.Equals(username)) && (strpasswd.Equals(password)))
{
  MessageBox.Show("Logged in");
  form1.Visible = true;
  form1.WindowState = FormWindowState.Maximized;
}
else
{
  MessageBox.Show("Wow, how did you screw this one up?");
}

然而,Form1不会变为可见状态(因为我将其启动为visible=false),在他们登录后。有人可以帮忙吗?
编辑:
非常好的回复,但我的问题仍然存在。我基本上想要首先加载Form2(这很容易,我运行Form1并将其设置为隐藏),但是当关闭Form2时,我也希望关闭Form1。
private void Form2_FormClosing(Object sender, FormClosingEventArgs e)
{
  Form1 form1 = new Form1();
  form1.Close();
  MessageBox.Show("Closing");
}

这似乎不起作用...


编辑了我的答案,以便在关闭Form2时关闭Form1。在“Form2_closed”事件上调用form1.Close() - this. __curious_geek
2个回答

10
你需要将一个表单的引用传递给另一个表单,以便在另一个表单中使用。这里我举了一个例子,展示了两个不同表单之间如何通信。该示例修改了一个表单中标签的文本,使其能够从另一个表单中访问。

示例项目下载链接

//您的Form1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}

//您的表单2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }

    //Added later, closing Form1 when Form2 is closed.
    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        mainForm.Close();
    }
}

alt text
(来源:ruchitsurati.net)

alt text
(来源:ruchitsurati.net)


将form2.Closed事件从form1挂钩,当它被调用时关闭form1。 - jgauffin

0
当您登录并执行Form1.visible = true;时,您是否也尝试过Form1.Show();,该命令应显示form2。
然而,个人而言,我更喜欢在program.cs文件中直接设置应用程序运行form2
static void Main()
{
    Application.Run(new Form2());
}

然后当用户成功登录后,执行

form1.Show();
this.Hide(); // this part is up to you

请注意,在form2中,当/在您实例化form1之后,您可能还想添加以下内容:

newform1.FormClosed += delegate(System.Object o, FormClosedEventArgs earg)
               { this.Close(); };

当form1关闭时,这将关闭form2。

更好的做法是在一个新线程中执行form1.Show(),然后用this.Close();关闭form2。这样就不需要添加到form2的FormClosed事件中:您可以在启动新线程的同时立即关闭form2。但使用线程可能会有些复杂。

编辑: form2是form1的父窗体。如果form2是您的主应用程序窗体,则关闭它将关闭您的程序(通常情况下)。因此,您要么只隐藏和禁用form2,并在form1关闭后才关闭它,要么在新线程中启动form1。您的编辑基本上打开form1,然后立即关闭它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接