Calling MessageBox.Show from a separate form - c#

I'm wondering today if there is any way to show a messagebox with a separate form as it's parent. As an example, say I have Form1 and Form2. From Form1, how do I call a messagebox to show with Form2 as the parent? In my case, Form2 is dynamically created, if that makes a difference.

You can pass a Form instance as the first parameter to MessageBox.Show().

Related

How to create Form On Top and cannot access other forms

Currently I have two forms(Form1 (base form) and Form2), from form1 I open form2, I want form1 to be inaccessible (unable to click buttons and access any other objects on that form) while form 2 is still open, and once form2 is closed I can access form1 again, I don't know what this behavior is called
I know how to put the form always on top via newForm.TopMost = true and how to check if a form is open via Application.OpenForms.OfType<Alert_Form>().Any(), Anyone know the sniplet I need to achieve what I want for form1 and possible (any other form)
Thanks and cheers
You simply call ShowDialog on your Form2 instance rather than Show. That will display a modal dialogue, which is the behaviour that you describe.

Give focus to form2

I have a program with two forms, but Form1 is opening up over Form2, which isn't good since you need to use Form2 first. How can you force focus to Form2 when the application runs?
Use ShowDialog for Form2 instead of Show.
You can also use Application.OpenForms property to get the already opened form Form2 and then call its Focus method like:
if(Application.OpenForms["Form2"] != null)
Application.OpenForms["Form2"].Focus();

Better way to Display forms one on top of another

I have a Main form.I want to launch another form from it and launch another from the launched form.I want to ensure that the Main form is not editable when sub forms are displayed so i use showdialog()
Mainform>(Showdialog)>form1>(showDialog+dispose)>form2(dispose)>Mainform
From Mainform i call form2.ShowDialog() then from form2 i use the following code to launch another form
this.visible=false;
form3.showdialog();
this.dispose();
But there are some problems in this.Is there a better way to achieve what im looking for?
edit:more description
I have a Main form,User clicks a Button on Mainform>Form1 is lauched>User clicks a Button in Form1>Form 2 is lauched(diposing/hiding form1) after form2 is closed Mainform should be brought to front and made editable,until then all other forms should be on top of Mainform and Mainform should be un-editable
The problem is that you have to specify the MainForm as the parent for (both) form2 and form3. When you use the overload of ShowDialog that has no parameters, WinForms uses the active form as the parent, so form3's parent becomes form2 automatically. You are then trying to close/dispose form2 causing form3 to become orphaned.
There are several options for getting the reference to MainForm, but the simplest is to use:
form2/3.ShowDialog(Application.OpenForms["MainForm"]);
Assuming that you have set the Name property on MainForm to "MainForm".
In your code, this.dispose() is executed only after form3 is closed. What i think you want is to close form2 after form3 was closed, so you can call this.Close() instead of this.Dispose().
this.visible=false;
form3.showdialog();
this.Close();
Or maybe, after form3 is shown up you dont need form2 any more. That meas:
this.visible=false;
//show instead of showdialog so it wont wait until form3 is closed
form3.show();
this.Close();
It looks like you are trying to implement something like a wizard. The best solution would be to launch all the child forms sequentially, in the main form.
If you need to pass data along the sequence, you should pass it from each dialog to the main form, which then passes it to the next dialog.
MainForm:
Form1 f = new Form1();
if (f.ShowDialog(this) == DialogResult.OK) {
Form2 f2 = new Form2();
f2.ShowDialog(this);
}
Form1 (button click which will open the form 2):
button1_click(object sender, EvengArgs e) {
this.DialogResult = DialogResult.OK;
Close();
}

c# gui - navigate between forms

I'm programming c# GUI and I have 2 forms.
Form1 is my main form, and it has a button to open form2.
When the button in form1 is being clicked, I hide form1, create a new object of form2 and show form2.
I have a back button in form2. I want the behavior of this button to close form2, and show again the hidden form1.
How can I do it?
Have your form1 subscribe to the VisibleChange event of form2 and act accordingly. It will have to "remember" whether form2 is visible or hidden (or query it directly).
The alternatives are:
Your form2 will need a reference to form1.
This can be done in a number of ways - passing it in a constructor parameter, adding a property and assigning form1 to it.
Either of these ways will tightly couple these forms to each other (bad thing).
Have you tried
Form1.Visible = true;
Form1.Activate();
And then in the Form1 VisibleChanged Event you simply write
Form2.Close();

Is there an accepted practice for cross-form control manipulation?

Let's say I have two forms: Form1 and Form2. Form1 has a textbox, Textbox1 and Button1.
When Button1 is clicked, a new instance of Form2 is created and shown. If Form2 needs to access Textbox1, how should expose it? Should Form2 have a public variable to hold a reference to the textbox? Or, when Form2 closes, should it invoke some public method on Form1 that updates the textbox? Thanks for your advice.
You should probably add a public property to the first form that exposes the textbox's text.
However, much more importantly, you should name your controls and forms.
There is (almost) nothing worse than a form with controls textBox1, button1, comboBox13, checkBox37.
If Form2 needs the text box value from Form1 when it loads, I would add the value to Form2's constructor method and pass it in that way.
If Form1 needs to obtain a new value entered in Form2 you can create a delegate with an Event that passes the value back to an assigned event handler in Form1.
Creating a public property may be the fastest solution, but I would try to stay away from circular references between forms if that is the case.
Hope this helps!

Categories

Resources