我想从Form2控制Form1

所以我基本上希望用户先登录才能使用其他表单。 但是,我的困境是登录框在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"); } 

这似乎不起作用……

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

下载示例项目的链接

// 你的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://sofzh.miximages.com/c%23/frm1.png

替代文字http://sofzh.miximages.com/c%23/frm2.png

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

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