我想从Form2控制Form1

时间:2010-06-30 04:57:54

标签: c# winforms

所以我基本上希望用户先登录才能使用其他表单。但是,我的困境是登录框在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在登录后不会显示(因为我将其作为visble = false启动)。有人可以帮忙吗?

编辑:

精彩的回应,但我的问题仍然存在。我基本上想要加载Form2 First,(这很容易我运行Form1并将其设置为隐藏)但是当Form2关闭时,我也希望Form1关闭。

private void Form2_FormClosing(Object sender, FormClosingEventArgs e)
{
  Form1 form1 = new Form1();
  form1.Close();
  MessageBox.Show("Closing");
}

这似乎不起作用......

2 个答案:

答案 0 :(得分:10)

您需要将一个表单的引用传递给另一个表单,以便可以在另一个表单中使用它。在这里,我举了两个不同形式如何相互通信的例子。此示例从另一种形式修改一种形式的Label文本。

<强> Download Link for Sample Project

// 您的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; }
    }
}

// 您的Form2

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 http://demo.ruchitsurati.net/files/frm1.png

alt text http://demo.ruchitsurati.net/files/frm2.png

答案 1 :(得分:0)

当您登录并执行Form1.visible = true;时,您还尝试了应显示form2的Form1.Show();

但是,就个人而言,我更愿意将应用程序设置为直接在form2文件中运行program.cs

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(),然后在form2中执行this.Close();。这消除了添加到form2的FormClosed事件的需要:因此,您可以在新线程中启动form1后立即关闭form2。但是使用线程可能会有点复杂。

编辑: form2是form1的父级。如果form2是你的主申请表,关闭它会关闭你的程序(通常)。因此,您要么只是隐藏和禁用form2,只在form1关闭后关闭它,或者在新线程中启动form1。你的编辑几乎打开了form1,然后立即关闭它。