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

时间:2010-10-19 03:03:26

标签: c# .net winforms .net-2.0

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

on More Button的Click事件Handler我写了以下代码

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

但是发生了什么,它并没有关闭第一种形式。所以,我将此代码修改为

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

此处显示第二种表单,并在几秒钟内关闭表单。

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

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

11 个答案:

答案 0 :(得分:50)

在我看来,主要表格应该负责打开两个儿童表格。这是一些伪解释我会做什么的:

// 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。这种方法的主要好处是您可以根据需要进行复制,并且可以非常轻松地为某种基本工作流建模。

答案 1 :(得分:36)

如果我找对你,你是这样想的吗?

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.
    }

答案 2 :(得分:13)

好的,所以我用过这个:

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();

祝你好运!

答案 3 :(得分:6)

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

对于Ex

  1. 创建三个窗口
  2. Form1 Form2 Form3
  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保留为

答案 4 :(得分: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;
}

答案 5 :(得分:1)

你可以考虑这个例子

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

答案 6 :(得分:0)

例如,您有一个名为@Override protected String doInBackground(String... params) { Log.e("Test", "DOINBG Working.."); String storageUrl = "https://firebasestorage.googleapis.com/v0/b/frost-bird-1d290." + "appspot.com/o/images.json?alt=media&token=b0a511d4-f0ea-4ee0-a063-69b7fd050f49"; FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(); StorageReference reference = firebaseStorage.getReferenceFromUrl(storageUrl); final File localFile; try { localFile = File.createTempFile("images", "json"); FileDownloadTask task = reference.getFile(localFile); try { Tasks.await(task); // or use await with timeout: Tasks.await(task, 30, TimeUnit.SECONDS) if (task.isSuccessful()) { Toast.makeText(getContext(), "File downloaded successfully.", Toast.LENGTH_SHORT).show(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(localFile))); StringBuilder result = new StringBuilder(); String line = null; while((line.concat(String.valueOf(reader.read()))) != null){ Log.e("Test", "Result - "+ result); result.append(line); } finalRes.concat(result.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else { Log.e("Test", "Failed: " + task.getException().getMessage()); Toast.makeText(getContext(), "File downloading failed", Toast.LENGTH_LONG).show(); } } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } Log.e("Test", "String Downloaded- "+finalRes); return finalRes; } 的{​​{1}}。首先点击它会打开Button的{​​{1}}来调用另一个Button1,您应该将以下代码写入您的按钮。

EventHandler

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

Button2 要么 Form

答案 7 :(得分:0)

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

重要的是要知道表单会消耗一些ram(至少一点点),所以关闭那些你不会使用的东西是个好主意,而不是仅仅隐藏它。在大项目中发挥作用。

答案 8 :(得分:0)

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
}

答案 9 :(得分:0)

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

对于我来说,在启动form1之前,我首先要打开一个Login窗口。我从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();
        }

答案 10 :(得分:0)

使用this.Hide()代替this.Close()