Taskbar icon opens the wrong Active form - c#

Having a strange behaviour with my application whereby when navigation between web browser (or any other application) and clicking back into the application seems to open the wrong Form? So user literally has to make use of Tab window to open the correct Form.
For e.g. Form1 is the main form. User clicks a button which opens Form2. Form1 is hidden behind the scene while Form2 opens. Now if user goes to a different application e.g. browser and clicks back into the application Form1 is displayed and there is no other way of going back to Form2 without the Tab window?
I have used the .ShowDialog() property when opening Form2 which disabled the parent form Form1 but still seems to do it occasionally?!?
I have also set the ShowInTaskBar for Form2 to False so that there is one icon in taskbar for all forms.
Not really sure what can cause this behaviour to happen?
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
}

I think you need to tell Form2 who its owner form is.
Like this:
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Owner = this;
form2.ShowDialog();
}
see System.Windows.Forms for more information

When you open form2, you need set mdiParent of form1.
First, set form1 as "isMdiParent" to "true" in properties, and then use the follow code:
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.MdiParent = this;
form2.Show();
}

Related

C# propery closing of an application when a form is still open

What's the proper way to close application with clicking on X in built in menu strip. Let's say that my Form1 opens Form2, when I close my Form2 my Form 1 stays open. What I want to achieve is that my application stops when I close my Form2. Does anybody know how to achieve this and how to reference it to X button on built in menu strip.
Try this:
Application.Exit();
In case it doesn't work, you have to provide more information and be more specific with code
In Form2 you could Register to the Closing Event in constructor something like this:
public Form2()
{
this.FormClosing += Form_OnClosing;
}
Then in the event close the Form1 and/or exit the application
private void Form_OnClosing(object sender, EventArgs args)
{
Application.OpenForms[0].Close();
Application.Exit();
Environment.Exit();
}
Try it
form2 F2 = new form2();
F2.ShowDialog()
I think you have a trouble with create new form children

Setting the event for first form when the second form is closed that is opened by first form in Windows form

I am developing a .NET windows form application. I am absolute beginner to .NET Windows form, I am an asp.net developer. I am having a problem with setting events to forms.
Inside the form1, I open the form2 like this in a click event
Form2 form2 = new Form2();
form2.show();
Inside the form2, there is a button and when the button is clicked, I will close the form2 and the fire an event in form1 that opened form2. How can I bind event between that 2 forms? How can I do it?
You can use the FormClosed event on the Form class.
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosed(v=vs.110).aspx
form2.FormClosed += Form2_FormClosed;
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
}

C# WinForms application showing many tray icons

I'm super new to C# and this is my third question here regarding it.
I'm making an app which can be minimized to the system tray. I have two forms named Form1 and Form2. What I have done so far is:
In Form1, I have a button which is showing the Form2 using this code:
this.Hide();
Form2 form2 = new Form2();
form2.Show();
The Form2 has a button which is hiding it, using this code:
this.Hide();
Now, I have the tray icon on the task bar. The tray icon has a ContexMenuStrip, and there is an option named show using this code:
Form1 form1 = new Form1();
form1.Show();
The problem is that when I click on it, a second tray icon is appearing on the taskbar. Both tray icons have the same menu and both are working. If I click on show again another window with Form1 pops up, and there are three tray icons, and so on....
Can someone help me?
It's because you are creating a new Form1 everytime.
Form1 form1 = new Form1();
You don't want to create a new Form1, you want to show the old one. Give Form2 a reference to your first form1 (call it theMainform1 for example). And then instead of
Form1 form1 = new Form1();
form1.Show();
You want to do
theMainform1.Show();
So you would have:
this.Hide();
Form2 form2 = new Form2();
form2.theMainform1 = this;
form2.Show();
The issue is that you are making a new instance of Form1. This creates a brand new window instead of reviving your old one.
Form1 form1 = new Form1();
form1.Show();
You need to have Form2 reference the original instance of Form1. You can make a constructor to pass in a self reference that would look like
Form2 form2 = new Form2(this);
You can prevent windows from having icons in the taskbar by settings ShowInTaskbar to false on the form. However, the other answers are correct when they say you're creating a new form over and over.
Why would you want two forms to show at the same time? Should they both be on the screen at the same time and be active at the same time? If so, you might try a MDI interface. http://en.wikipedia.org/wiki/Multiple_document_interface
It's possible in WinForms, but I think Microsoft is moving away from them in WPF.
Here is a working code in case that someone is looking for it:
Form1:
/* Hiding Form1 and showing Form2 */
private void btnHideForm1_Click(object sender, EventArgs e)
{
Form mod = new Form2();
mod.Owner = this;
mod.Show();
this.Hide();
}
Form2:
/* Hiding Form2 and showing Form1 */
private void btnHideForm2_Click(object sender, EventArgs e)
{
this.Owner.Show();
this.Close();
}
Thanks for your help guys!!!
I LOVE YOU!!!

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# Form Problem: new form losing control and randomly hiding

I'm encountering strange behavior with forms on a c# 3.5 app. On a button click, my form1 hides itself, creates a new form2, and shows form2. Form1 also contains the event method triggered when form2 closes. Here's the code inside Form1:
Form2 form2;
void button1_Click(object sender, EventArgs e)
{
this.Hide();
form2 = new form2();
form2.Show();
form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
}
void form2_FormClosed(object sender, FormClosedEventArgs e)
{
form2.Dispose();
form2 = null;
this.Show();
}
Now, my problem is that sometimes when I open form2 (hiding form1), or when I close form2 (showing form1), the new form will come up on the screen for a blink and then hide itself. It's still open and I can click it from the taskbar to show it again, but the window itself is sent behind any other open windows. It looks like it opens up but minimizes instantly.
This behavior occurs randomly. Sometimes forms will open up and hide without a problem, but sometimes they'll lose focus over another window. I've tried using focus(), activate(), and topmost but all have failed to prevent the sudden hiding.
Does anyone know why is this happening and how to fix it?
Thanks.
You hide your form too soon. For a brief moment, your app has no window that can contain the focus. That forces Windows to go hunting for another window to give the focus to, it will pick one from another application. That window will now be the foreground window, your second form will not get the focus and appear lower in the Z-order. The fix is simple:
void button1_Click(object sender, EventArgs e)
{
form2 = new form2();
form2.Show();
form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
this.Hide(); // Moved
}

Categories

Resources