Error with showing a new form in C# - c#

I need your help please
I have created a form and insert a timer & progress bar into it
when the value of progress bar reach to 100% I want to close this form and open the main form of my program
I write this code but when I Run the program it show this error :
( Form that is already displayed modally cannot be displayed as a modal dialog box. Close the form before calling showDialog.)
How I can resolve this problem
Form1 MainForm = new Form1();
public Welcome_window()
{
InitializeComponent();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(10);
if (progressBar1.Value == 100)
{
this.Visible = false;
MainForm.Visible = false;
MainForm.ShowDialog();
this.Close();
}
}
}

I think the problem is that you don't stop the timer, so the tick event will be fired even if the progress already reached 100%.
Form1 MainForm = new Form1();
public Welcome_window()
{
InitializeComponent();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(10);
if (progressBar1.Value == 100)
{
timer1.Stop();
this.Visible = false;
MainForm.ShowDialog();
this.Close();
}
}

Related

Timer won't stop after being stopped or disabled

I have a problem with a timer on a form. I've enabled it from the properties and set the interval value 5000. On the tick event, I want to close the current form and open form1, but it's not working. The current form closes and form1 opens every 5 seconds, not only once. What should I do? Thank you in advance!
This is the tick event:
private void timer1_Tick(object sender, EventArgs e)
{
this.Hide();
Form1 frm = new Form1();
frm.ShowDialog();
timer1.Enabled = false;
}
frm.ShowDialog(); is a blocking call, therefore the next line won't get executed until the new form is closed. Make sure you start by disabling the timer:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
this.Hide();
Form1 frm = new Form1();
frm.ShowDialog();
}
You need to disable the timer before calling theShowDialog, so move the timer1.Enabled = false; to the first line. Also I suggest that you add the frm.Closed event so that your main form will close after you closed the second form: This is what you want:
timer1.Enabled = false;
Hide();
Form1 frm = new Form1();
frm.Closed += (s, args) => Close();
frm.ShowDialog();

Disabling a button when a form is loaded and enabling when the form is closed

I want to disable a button (button3) on a primary form when a second, modeless form (Form2) is loaded, and then re-enable the button when the modeless form is closed.
Here is what I've tried:
private void button3_Click(object sender, EventArgs e)
{
Form2 p = new Form2(label1.Text);
p.Show();
if (p.Shown)
this.button3.Click += new System.EventHandler(this.button3_Click);
else
this.button3.Click -= new System.EventHandler(this.button3_Click);
}
The best method for achieving this would be to disable button3 prior to showing Form2, and using the FormClosed event on Form2 to re-enable button3 once the form is closed:
public partial class Form1 : Form
{
...
private void button3_Click(object sender, EventArgs e)
{
// Instantiate the form and assign the FormClosed event
var form = new Form2(label1.Text);
form.FormClosed += Form2_FormClosed;
// Disable button3
button3.Enabled = false;
// Show the form
form.Show();
}
// Occurs when Form2 is closed
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
// Re-enable button3
button3.Enabled = true;
}
}
An alternative method, that assigns a lambda expression to the FormClosed event:
private void button3_Click(object sender, EventArgs e)
{
// Instantiate the form
var form = new Form2(label1.Text);
// Assign a lambda method to the FormClosed event to re-enable button3
form.FormClosed += (s, a) => button3.Enabled = true;
// Disable button3
button3.Enabled = false;
// Show the form
form.Show();
}
I did a similar thing, i m not sure to understand what you want to do but maybe it will help you.
public partial class Form2 : Form
{
private void button3_Click(object sender, EventArgs e)
{
Button3.Enabled = false;
Form2 p = new Form2(label1.Text);
p.ShowDialog();
//the code will stop here until you finish your work on form2
Button3.Enabled=true;
}
it works with me.
But if your form3 is just a short label use:
Button3.Enabled= false;
MessageBox.show ("blabla");
Button3.Enabled=true;

Nothing happens when I close maximized MDI child form

I have Form1 with 2 radio buttons (rb1 and rb2) and one ordinary button (btn). When I click on btn I should open Form2, as MDI child of Form1 if rb1 is checked, or as ordinary Dialog if rb2 is checked. Also, there can only be one Form2 opened at any moment.
This is my code:
public partial class Form1 : Form
{
Form2 f2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (f2 != null)
{
MessageBox.Show("Close form!");
return;
}
f2 = new Form2();
if (radioButton1.Checked == true)
{
this.IsMdiContainer = true;
f2.MdiParent = this;
f2.Show();
}
else
{
f2.Show();
}
f2.FormClosed += f2_FormClosed;
}
void f2_FormClosed(object sender, FormClosedEventArgs e)
{
this.IsMdiContainer = false;
f2 = null;
}
}
Everything works as it should except when I maximize Form2 as MDI child and then close it. After that screen stays the same (as I even didn't closed Form2) but I am able to open new Form2, and then Form1's title is "Form1 - [Form2]", and if I repeat the process it would be "Form1 - [Form2] - [Form2]", etc.
I figured out that I my f2_FormClosed method should be
void f2_FormClosed(object sender, FormClosedEventArgs e)
{
f2.Hide(); // <<<<<<<<-----------NEW
this.IsMdiContainer = false;
f2 = null;
}
but I don't know why; Form2 should be closed, I don't know why should I have to hide it?!
Thanks!
I agree with Hans, switching IsMdiContainer at run-time is wonky and is likely to produce other side-effects you haven't seen yet.
Seriously consider a different design for your app.
With that in mind, here's probably the stupidest hack I'll post all day:
public partial class Form1 : Form
{
Form2 f2;
System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
public Form1()
{
InitializeComponent();
tmr.Interval = 100;
tmr.Enabled = false;
tmr.Tick += delegate (object sender, EventArgs e) {
tmr.Stop();
this.IsMdiContainer = false;
};
}
private void button1_Click(object sender, EventArgs e)
{
if (f2 != null)
{
MessageBox.Show("Close form!");
return;
}
f2 = new Form2();
f2.FormClosed += delegate(object sender2, FormClosedEventArgs e2) {
f2 = null;
};
if (radioButton1.Checked == true)
{
this.IsMdiContainer = true;
f2.FormClosed += delegate(object sender3, FormClosedEventArgs e3) {
tmr.Start();
};
f2.MdiParent = this;
}
f2.Show();
}
}
*I originally tried Invoking the call to change IsMdiContainer but that didn't work, so I switched to the Timer. Stupidity that works. Use this solution with caution...

C# close all forms

I have a problem with my program.
I have 3 Forms: First one opens a second form. Second one opens a third form or returns to the first form. The third form can open the first or second forms.
This is how I open a second Form:
private void Open_second_form()
{
Form2 myForm = new Form2(Type_person);
this.Hide();
myForm.ShowDialog();
this.Close();
}
The rest of the forms I open exactly the same.
Here is a code for how I close forms. Every Form has this method:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Exit or no?",
"My First Application",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information) == DialogResult.No)
{
this.Close();
Environment.Exit(1);
}
}
When I open the third form I get 3 MessagesBoxes. If I open first form I got only 1 MessageBox.
I want to close all forms while getting only one MessageBox.
I tried a lot of solutions but none worked.
I tried Application.exit();
Please help me :)
Your confirmation message is funny and result is unobvious =D
There are 2 solutions possible to your issue.
1) If user chooses to close application - don't display confirmation anymore
private static bool _exiting;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (!_exiting && MessageBox.Show("Are you sure want to exit?",
"My First Application",
MessageBoxButtons.OkCancel,
MessageBoxIcon.Information) == DialogResult.Ok)
{
_exiting = true;
// this.Close(); // you don't need that, it's already closing
Environment.Exit(1);
}
}
2) use CloseReason to confirm only user actions
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
if(MessageBox.Show("Are you sure want to exit?",
"My First Application",
MessageBoxButtons.OkCancel,
MessageBoxIcon.Information) == DialogResult.Ok)
Environment.Exit(1);
else
e.Cancel = true; // to don't close form is user change his mind
}
}
I'm using this snippet always on my menu form. I hope this helps.
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
if (Application.OpenForms[i].Name != "Menu")
Application.OpenForms[i].Close();
}
Call the Environment.Exit(0); method
private void btnExit_Click(object sender, EventArgs e)
{
Environment.Exit(0);
}
For the form 1, considering the button is called btnForm1To2
private void btnForm1To2_Click(object sender, EventArgs e)
{
using (Form2 myForm = new Form2(Type_person))
{
this.Hide();
myForm.ShowDialog();
this.Show();
}
}
Inside FORM 2, considering the button to page 1 is btnForm2To1, and the button to page 3 is btnForm2To3
private void btnForm2To1_Click(object sender, EventArgs e)
{
// Just close the form 2, as it was called from form 1, this form will be displayed
this.DialogResult = DialogResult.OK;
}
private void btnForm2To3_Click(object sender, EventArgs e)
{
using (Form3 myForm = new Form3(...))
{
this.Hide();
DialogResult form3result = myForm.ShowDialog();
// Now handle the results from form 3 to navigate to form 2 or 1
// In my example, form 3 replies Abort to go back to 1. On cancel (or other dialog results) we will stay on form 2
if (DialogResult.Abort.Equals(form3result))
{
this.DialogResult = DialogResult.OK;
}
else
{
this.Show();
}
}
}
Inside FORM 3, considering the button to page 1 is btnForm3To1, and the button to page 2 is btnForm3To2
private void btnForm3To1_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Abort;
}
private void btnForm3To2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
And if you want that the user confirms his click with a MessageBox, just place them before the this.DialogResult in each button click method
Note that this way is faster than Environment.Exit(0);.
WPF
Set your Window Closing Event in (###Window.xaml)
Closing="Window_Closing"
and then in (###WWindow.xaml.cs)
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
foreach(Window w in Application.Current.Windows)
if(w != this)
w.Close();
}
Windows Form
Go to Form#.cs [Design] >> Form# Properties
Then click on Events
And double-click on FormClosing
In (Form#.cs)
If you're closing from your Startup form, it's better to use this code.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
for(int i = 1; i < Application.OpenForms.Count; ++i)
Application.OpenForms[i].Close();
}
else (Works for any form)
private void Form7_FormClosing(object sender, FormClosingEventArgs e)
{
for(int i = 0; i < Application.OpenForms.Count; ++i)
if(Application.OpenForms[i] != this)
Application.OpenForms[i].Close();
}
If you'd like to close all forms (particularly dialog windows) except for the main form, I've found this function to be useful.
public static void closeAll()
{
FormCollection fc = Application.OpenForms;
if (fc.Count > 1)
{
for (int i = (fc.Count); i > 1; i--)
{
Form selectedForm = Application.OpenForms[i - 1];
selectedForm.Close();
}
}
}
Application.Current.Shutdown();
That's what I use whenever I need to close an entire application. It closes all forms, so great for closing everything. I don't know if this is exactly what you want.
I used this and it worked for me:
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
if (Application.OpenForms[i].Name != "FRM01"&&Application.OpenForms[i].Name!= "FRM02")
Application.OpenForms[i].Close();
}
Those "FRM" things are the names of my forms, what you can do there is to add as many forms as you like to have as "parents". So each time it iterates it will check if the names of those forms are the ones you wish to keep.
I recommend you add that 'for' into your form closing handler if you wish to control an user from closing parent forms and child forms to still be there.
It is always better to use MDI forms (MDI link here)

How to close MDIChild C# VS2010?

Actually Its my first project. While I want to convert my VB.Net2008 to C#2010 I have few clarification pls.
In Form2 Properties I set - IsMDIContainer = True. Then the below code to open my MdiChild and now what is my problem when I click the close button, it's also closing the MDIParent. But I need to close only mdichild... for that I tried as like Vb.Net2008 style by the following codes placed in MDIParent Form2, Its not working. Any right directions ...
private void toolStripButton1_Click(object sender, EventArgs e)
{
Form3 NwMdiChild2 = new Form3;
NwMdiChild2.MdiParent = this;
NwMdiChild2.Dock = System.Windows.Forms.DockStyle.Fill;
NwMdiChild2.Show();
}
private void Form2_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
Form[] MdiChildForms = this.MdiChildren;
int kkk1 = MdiChildForms.Length;
int x = 0;
for (x = 0; x <= MdiChildForms.Length - 1; x += 1)
{
if (MdiChildForms[x].Name == "Form1")
{
kkk1 = kkk1 - 1;
}
MdiChildForms[x].Close();
}
if (kkk1 > 0)
{
// For Not Closing
e.Cancel = true;
}
else
{
// For Closing
e.Cancel = false;
Application.Exit();
}
}
Any Right Directions for Me?
I'm not sure if I understand well what you want to achieve: do you want, when click Parent Form close button, insteed of closing parent form, to close all the child's form? Form2 is your main form (parent MDI container), Form3 is the MDI children, isn't it?
Please try following code and tell if it's what you are asking for:
private void toolStripButton1_Click(object sender, EventArgs e)
{
Form3 NwMdiChild2 = new Form3(); //don't forget ()
NwMdiChild2.MdiParent = this;
NwMdiChild2.Dock = System.Windows.Forms.DockStyle.Fill;
NwMdiChild2.Show();
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
//if no MDI child - this is going to be skipped and norlmal Form2 close takes place
if (this.MdiChildren.Length > 0) //close childrens only when there are some
{
foreach (Form childForm in this.MdiChildren)
childForm.Close();
e.Cancel = true; //cancel Form2 closing
}
}

Categories