How to open a child form from another child form? - c#

I am working on a Windows application. I have a MainForm (Parent) and several childForm. There is a listview in MainForm that contains a childForm name list and by clicking on each name in the list, the relevant childForm shows and the previous ChildForm closes.
I use this codes to show childForm and close the previous childForm in MainForm.cs (ParentForm):
CloseForms();
frm_draft = new frm_ShowDraft();
frm_draft.MdiParent = this;
frm_draft.Show();
CloseForm() is a method that checks, which childForm is runnig and closes it.
So far everything is good.
In one of the childforms there is a Button. When the user clicks on it, it should close this childForm and show another. But when I click on the button, childForm2 shows out of MainForm. How can I show it inside of MainForm?
My code in the button click event:
this.close();
frm_c2 = new frm_child2();
frm_c2.MdiParent = new MainForm().ParentForm; /// Or this.MdiForm
frm_c2.Show();

You should set same MdiForm and call Close at the end:
frm_c2 = new frm_child2();
frm_cLetter.MdiParent = this.MdiParent;
frm_cLetter.Show();
this.Close();

http://www.independent-software.com/weifenluo-dockpanelsuite-tutorial-cookbook/
To show a child form in the main form use the WeiFen Luo library.
This control will make it easier to dock forms into your main form visual studio docking screens
Form with 3 forms inside:
Make sure the IsMdiContainter prop is true.
Example:
public Form1()
{
InitializeComponent();
Form2 f2 = new Form2(); // create new form
// dockPanel is an control from WeiFen Luo more info see the link
// dockPanel control is docked in your mainform.
// this will open Form2 in the dockPanel and align it left
f2.Show(dockPanel, DockState.DockLeft);
}
More docking options:
DockState.Fill docks form in over the hole dockPanel
DockState.Right docks form at the rightside of the dockPanel
DockState.Top docks form at the topside of the dockPanel
for more option check the link
This control will handel responsifnes of the docking forms and will handle allot of positioning calculations for you.

Related

Opening panel of another form by button of the main form in c# windows application

There are 2 windows forms, one is the main form and another is the subform. In the subform, there is 4 different panel Panel 1,2,3 and 4.In the main form there is one Button.
what I want to do:
I want to open the 2nd panel of subform by clicking the button of the main form.
All you need to do is to keep a reference variable to your subform, put it in your main form, and set its value when you open the subform, like this:
private Form _subForm;
private void OpenSubForm()
{
_subForm = new SubForm();
_subForm.Show();
}
and then you could use it to access your subform's panels from your main form:
private void ButtonClick()
{
_subForm.panel1.Show();
}

How to show new form without disabling the parent form?

I have shown a new form in button click on parent form like below,
Here the background parent form gets disabled when a new child form is activated.
Is there any available options to show the child form without disabling the parent form?
Regards,
The Show function shows the form in a non modal form. This means that you can click on the parent form.
ShowDialog shows the form modally, meaning you cannot go to the parent form
Application.Run() runs the main parent form, and makes that form the main form. Application.Run() is usually found in main.
If it is fully disabled (no interaction possible), you are using .ShowDialog() on the child form instead of .Show(). If you use .Show() you will be able to use both forms
Example:
ChildForm childForm = new ChildForm();
childForm.Show();
after you open the new form and call this.Activate(); it will refocus on the parent window, but this will cause it to loose focus for a fraction of a second

How to prevent clicks outside the current form?

I want the form which will open when the user click a button, I don't want the user to click anywhere else outside this form(preventing him from clicking any other buttons on the parent form), I want to restrict his actions inside this form until he close it (For sure this form is top most), and I want the form to make alert(flicker) to any clicks outside it so the user will understand that he have to close it first.
When opening the form instead of
Form form = new Form();
form.Show();
use
Form form = new Form();
form.ShowDialog()
Super easy fix!
I assume your code to show the form right now is
form.Show();
To create/show an instance of the form that is modal (restricts clicking to that form) all you need to change is that line to:
form.ShowDialog();
Liam

Form location relative to another form

I have a button on a form "Form1", when users click this button, another form "Form2" will pop up. How can I adjust Form2's location so that it is at the center of the Form1 when it pops up? I tried adjusting the location properties but it is not working.
Thanks for the help.
You need to set the StartPosition property of Form2 to CenterParent and show the form using
Form2 form2 = new Form2();
form2.ShowDialog();
If you don't want to show the form as dialog follow the confirmed answer of this question:
How do you set the StartPosition of a Windows Forms form using code?

Show MDI child Always on top of other MDI child

How do I show a MDIChild Form always on top of other MDIChild Forms ?
I have set TopMost property of the ChildForm to True, But the form still behaves the same way...
I have tried to set TopLevel property of ChildForm to True and got the error message... "Top-level Style of a Parented control cannot be changed."
How do I achieve this.
Thanks
A better solution that doesn't requiring changing every other form: - declare the new toolbox as a control of the Main Parent (this):
fForm fFormObj = new fForm();
fFormObj.TopLevel = false;
this.Controls.Add(fFormObj);
fFormObj.Parent = this;
fFormObj.TopMost = true;
fFormObj.Show();
The framework apparently does not support MDI child windows owning each other so you have to simulate that behavior yourself:
static Form f1 = new Form();
static Form f2 = new Form();
static Form f3 = new Form();
[STAThread]
static void Main()
{
f1.IsMdiContainer = true;
f2.MdiParent = f1;
f3.MdiParent = f1;
f1.Show();
f2.Show();
f3.Show();
f2.Activated += new EventHandler(f2_Activated);
Application.Run(f1);
}
static void f2_Activated(object sender, EventArgs e)
{
f3.Activate();
}
I generally just make owned forms not be MDI child forms. They don't stay in the MDI container, but at least they stay in front.
Perhaps the reason this limitation exists is because of the strange or ambiguous desired behavior when the MDI child that is the owner is maximized within the container. the above code will allow the owned form to go behind the maximized parent if you click on it in this case. If you have it outside the container, though, then it will remain visible.
//Edit
Since only one of your MdiChild form needs to be focused, try the following:
In the MdiChildActivate event re-focus or re-activate the required window as the activated child window.
You could also use the Deactivated event to enforce the re-focusing of the concerned child window.
When you create the form and show it also append a call to focus method.
ChildForm.Focus()
Setting the focus should make it topmost.
Hope it helps.

Categories