jsls
jsls

Reputation: 261

How to close a form and come back to mainform

My question seems very easy but it's actually quite tricky. I search a lot on here and I dont find anything conclusive.

I have a mainform which need to be constantly open. I have a button which call a form2, I do some action on it, then call a form3 which let the user choose some item then close it and come back to mainform. The tricky part is i need to pass data from f3 to f1.

My problem is, on the second form I have a next & cancel buttons (and a close button) . Next button hide f2, form1 "come back" & call the form3. Why not call directly the form3? because I need to pass data from form3 to form1 so i Need to call form3 from form1. So i want Cancelbutton (and closing button) to come back to form1 without calling form3. I am not sure to be understood so here's my code

public partial class Form1 : Form
    { 
 private void bouya_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.ShowDialog();

            Form3 form3 = new Form3(); //it opens when form2 closes!!!
            form3.ShowDialog();

           string data1 = form3.label2.Text;  //the data i need, without calling form3 from here i can't pass data !!!
           //do some action with data1

        }
    }

form2 is very simple

 public partial class Form2 : Form
    {
  private void Next_Click(object sender, EventArgs e)
        { this.Hide(); }
  private void Cancel_Click(object sender, EventArgs e) 
        {//i just want here to cancel winform3 to be called}
    private void Form2_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {  // Actually this command does'nt work at all i tried 
//to put a messagebox.Show("bla") nothing happens but i would like to do the same}

}

And form3 I select an item from a list to be send to form1

    public partial class Form3 : Form   
 {   
    private void button1_Click(object sender, EventArgs e)
            {
                foreach (Object obj in listBox1.SelectedItems)
                {
                    label2.Text = obj.ToString();
                    this.Hide();
                }
            }
    }

Ok for some of you my problem would seem useless and i complicated my code for nothing but i really need these form. (and i need to open form3 from form1 to send data 3 to 1)

Forget about *Form1 form1 = new Form1(); it calls a new form1 and i don't want it !

Upvotes: 0

Views: 251

Answers (1)

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56727

You actually do not need to call form3 from form1 just to pass a value. If I understand you correctly, the desired flow should be like this

form1
  opens
    form2
      opens
        form3
          |
          | value
          |
form1 <---+

So form1 opens form2 which opens form3 and the value from form3 should be passed back to form1, right?

What I'd do is declare a property ValuePickedInForm3 or whatever in form2 and get this in form1 when form2 closes.

Example

This pseudo-code is in the form2 class

public string ValueFromForm3
{
    get;
    private set;
}


public void ShowForm3()
{
    using (Form3 f3 = new Form3())
    {
       if (f3.ShowDialog(this) == DialogResult.OK)
           ValueFromForm3 = f3.TheValueYouNeed;
    }
}

This pseudo-code goes into the form1 class:

public void ShowForm2()
{
    using (Form2 f2 = new Form2())
    {
        if (f2.ShowDialog(this) == DialogResult.OK)
            DoSomethingWith(f2.ValueFromForm3);
    }
}

Upvotes: 1

Related Questions