Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Pages withing one Form? C#

Tags:

c#

winforms

I haven't done this for a while so am not quite sure how to do what I need, but I am sure it is pretty simple.

Basically, I have a form with a navigation pane. I want to make it so when a user clicks a button on that pane, say 'Home' it changes the content on the form, but doesn't actually switch to another form, if you get me?

As in, I would like the navigation pane to stay as it is the entire time and I only want the content of the form to change. It is almost like the 'TabControl' tool in Visual Studio's 'Toolbox' although instead of the tabs being directly above the content, I want them to be buttons displayed in a side pane. See the image below for a better understanding. Thanks!

(Side pane, and header stays the same regardless on what button is pressed, but the content changes.)

Form

like image 609
n00bAppDev Avatar asked Mar 11 '14 10:03

n00bAppDev


2 Answers

I'd implement this using UserControls. One UserControl is shown when a button is clicked. I'd create an interface (for example IView) that would be implemented by each UserControl that declares common functionality, like for example a method to check whether you can switch from one to another (like a form's OnClosing event) like this:

public interface IView
{
    bool CanClose();
}

public UserControl View1: IView
{
    public bool CanClose()
    {
       ...
    }
}

public UserControl View2: IView
{
    public bool CanClose()
    {
       ...
    }
}

Then, switching views is quite easy:

private bool CanCurrentViewClose()
{
    if (groupBox1.Controls.Count == 0)
        return true;

    IView v = groupBox1.Controls[0] as IView;
    return v.CanClose();
}

private void SwitchView(IView newView)
{
    if (groupBox1.Controls.Count > 0)
    {
        UserControl oldView = groupBox1.Controls[0] as UserControl;
        groupBox1.Controls.Remove(oldView);
        oldView.Dispose();
    }
    groupBox1.Controls.Add(newView);
    newView.Dock = Dock.Fill;
}

In a button you could do this:

private void btnHome_Click(object sender, EventArgs e)
{
    if (CanCurrentViewClose())
    {
        ViewHome v = new ViewHome();
        // Further initialization of v here

        SwitchView(v);
    }
    else
    {
        MessageBox.Show("Current View can not close!");
    }
}

I've successfully used this approach on many occasions.

like image 100
Thorsten Dittmar Avatar answered Sep 22 '22 10:09

Thorsten Dittmar


Simplest way is to place multiple Panels as content holders, implement content manager which keeps references to Panels and with it show/hide desired panel.

Simple, but for smaller apps it will work

like image 25
Mastenka Avatar answered Sep 18 '22 10:09

Mastenka