如何从另一个表单打开一个新表单

问题描述 投票:0回答:14

我有使用 ShowDialog 方法打开的表单。在这种形式中,我有一个名为“更多”的按钮。 如果我们单击“更多”,它应该打开另一个表单并关闭当前表单。

在更多按钮的单击事件处理程序上我编写了以下代码

MoreActions objUI = new MoreActions (); 
objUI.ShowDialog();
this.Close();

但是发生的事情是,它并没有关闭第一个表单。所以,我将这段代码修改为

MoreActions objUI = new MoreActions (); 
objUI.Show();
this.Close();

这里,第二个表单正在显示,并且在几秒钟内两个表单都被关闭。

任何人都可以帮我解决问题吗?我需要做的是,如果我们单击“更多”按钮,它应该打开另一个表单并关闭第一个表单。

任何形式的帮助都会对我很有帮助。

c# .net winforms .net-2.0
14个回答
63
投票

我认为主窗体应该负责打开两个子窗体。这是一些伪代码,解释了我会做什么:

// MainForm
private ChildForm childForm;
private MoreForm moreForm;

ButtonThatOpenTheFirstChildForm_Click()
{
    childForm = CreateTheChildForm();
    childForm.MoreClick += More_Click;
    childForm.Show();
}

More_Click()
{
    childForm.Close();
    moreForm = new MoreForm();
    moreForm.Show();
}

您只需要在第一个子项中创建一个简单的事件 MoreClick。这种方法的主要好处是您可以根据需要复制它,并且可以非常轻松地对某种基本工作流程进行建模。


57
投票

如果我没猜错的话,你会这样尝试吗?

alt text

进入这个?
alt text

在您的 Form1 中,在按钮中添加此事件:

    // button event in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog(); // Shows Form2
    }

然后,在您的 Form2 中,在按钮中添加此事件:

    // button event in your Form2
    private void button1_Click(object sender, EventArgs e)
    {
        Form3 f3 = new Form3(); // Instantiate a Form3 object.
        f3.Show(); // Show Form3 and
        this.Close(); // closes the Form2 instance.
    }

18
投票

好的,所以我用了这个:

public partial class Form1 : Form
{
    private void Button_Click(object sender, EventArgs e)
    {
        Form2 myForm = new Form2();
        this.Hide();
        myForm.ShowDialog();
        this.Close();
    }
}

这似乎工作正常,但第一个表单只是隐藏的,它仍然可以生成事件。需要“this.Close()”来关闭第一个表单,但如果您仍然希望表单运行(而不是像启动器一样),则必须将其替换为

this.Show();

祝你好运!


7
投票

我会使用一个在按下更多按钮关闭第一个对话框时设置的值,然后让原始表单测试该值,然后显示该对话框。

对于前任

  1. 创建三个窗口
  2. 表格1 表格2 表格3
  3. 向 Form1 添加一个按钮
  4. 向 form2 添加两个按钮

表格 1 代码

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

    private bool DrawText = false;

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog();
        if (f2.ShowMoreActions)
        {
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }

    }

Form2 代码

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

        public bool ShowMoreActions = false;
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMoreActions = true;
            this.Close();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

保持 form3 不变


3
投票

试试这个..

//button1 will be clicked to open a new form
private void button1_Click(object sender, EventArgs e)
{
    this.Visible = false;     // this = is the current form
    SignUp s = new SignUp();  //SignUp is the name of  my other form
    s.Visible = true;
}

3
投票
private void Button1_Click(object sender, EventArgs e)
{
    NewForm newForm = new NewForm();    //Create the New Form Object
    this.Hide();    //Hide the Old Form
    newForm.ShowDialog();    //Show the New Form
    this.Close();    //Close the Old Form
}

2
投票

你可以考虑这个例子

//Form1 Window
//EventHandler
Form1 frm2 = new Form1();
{
    frm2.Show(this); //this will show Form2
    frm1.Hide();  //this Form will hide
}

0
投票

例如,您有一个名为

Button
Button1
。首先单击它,它将打开该
EventHandler
Button2
来调用另一个
Form
,您应该将以下代码写入您的按钮。

your name example=form2.

form2 obj=new form2();

obj.show();

要关闭form1,请编写以下代码:

form1.visible=false;
或者
form1.Hide();


0
投票

您可以尝试添加一个布尔值,以便算法知道按钮何时被激活。单击时,布尔值检查为 true,显示新表单,最后一个表单关闭。

重要的是要知道表单会消耗一些内存(至少一点点),因此最好关闭那些您不会使用的表单,而不是仅仅隐藏它。在大型项目中发挥作用。


0
投票

您需要控制主窗体中子窗体的打开。

就我而言,我在启动 form1 之前首先打开一个登录窗口。我通过 Program.cs 控制一切。在 Program.cs 中设置验证标志。从 Program.cs 打开登录窗口。然后控制转到登录窗口。然后,如果验证良好,请从登录窗口将验证标志设置为 true。现在您可以安全地关闭登录窗口。控制权返回到 Program.cs。如果验证标志为 true,则打开 form1。如果验证标志为 false,您的应用程序将关闭。

在 Program.cs 中:

   static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 

        //Validation flag
        public static bool ValidLogin = false;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            Application.Run(new Login());

            if (ValidLogin)
            {
                Application.Run(new Form1());
            }
        }

    }

在Login.cs中:

       private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtUsername.Text == "x" && txtPassword.Text == "x")
            {
                Program.ValidLogin = true;
                this.Close();
            }
            else
            {
                MessageBox.Show("Username or Password are incorrect.");
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

0
投票

使用 this.Hide() 而不是 this.Close()


0
投票

对 Program.cs 执行此操作

using System;

namespace ProjectName 
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args) 
        {
            Application.EnableVisualStyles();
            Application.SetDefaultCompatibleTextRendering(false);

            new Form1().Show();

            Application.Run();
        }
    }
}

0
投票

在我看来它会是这样的:

        MoreActions objUI = new MoreActions();
        objUI.ShowDialog();
        this.Close();

-1
投票

如果您想首先运行特定的表单(或页面),请应用以下方法 在程序.cs中 将 Application.Run(...) 更改为

Application.Run(new form2()) // 在 form2 的位置更改你想要的表单名称

© www.soinside.com 2019 - 2024. All rights reserved.