Create, open, and control multiple forms in structured OOP style
As your applications grow, youโll likely need more than one form โ for example, a login screen, a settings window, or a results viewer. Rather than cramming everything into one file, you can build a better UI architecture by creating custom form classes.
In OOP, forms are just classes that inherit from Form. That means you can create, pass data between, and control them like any other object.
๐งฑ Defining Your Own Form Class
To create a new form:
๐ In Visual Studio:
- Right-click your project โ Add โ Windows Form โ Name it
FormSettings.cs - Visual Studio will generate:
FormSettings.csFormSettings.Designer.cs- Partial class
FormSettingsthat inherits fromForm
๐งช Example: Basic Custom Form
// FormSettings.cs
public partial class FormSettings : Form
{
public FormSettings()
{
InitializeComponent();
}
}
โ Now you have a standalone form class that can be used from other parts of your application.
๐งฐ Instantiating a Custom Form
From another form (like MainForm), you can create and show FormSettings:
๐น Modal Form (Blocks until closed)
FormSettings settingsForm = new FormSettings();
settingsForm.ShowDialog(); // Use for dialogs and user input
๐น Modeless Form (Stays open independently)
FormSettings settingsForm = new FormSettings();
settingsForm.Show(); // Use for tools, dashboards, etc.
๐ Passing Data to Forms (Constructor Injection)
// In FormSettings.cs
public FormSettings(string username)
{
InitializeComponent();
lblUser.Text = $"Welcome, {username}!";
}
// In MainForm.cs
FormSettings settings = new FormSettings("Alice");
settings.Show();
โ This is classic OOP dependency injection โ you’re giving the form the info it needs via its constructor.
๐ฌ Getting Data Back From a Form
For modal forms (like input dialogs), you can define public properties to expose selected values:
// In FormSettings.cs
public string SelectedTheme { get; private set; }
private void btnApply_Click(object sender, EventArgs e)
{
SelectedTheme = cboTheme.SelectedItem.ToString();
this.DialogResult = DialogResult.OK;
this.Close();
}
// In MainForm.cs
FormSettings fs = new FormSettings();
if (fs.ShowDialog() == DialogResult.OK)
{
string theme = fs.SelectedTheme;
}
๐ Reusing Form Instances (Advanced)
You can create a singleton-style form or store form instances for reuse:
private FormSettings _settingsForm;
private void ShowSettings()
{
if (_settingsForm == null || _settingsForm.IsDisposed)
_settingsForm = new FormSettings();
_settingsForm.Show();
_settingsForm.BringToFront();
}
๐ Summary
| Concept | Description |
|---|---|
| Custom Form Class | Your own class inheriting from Form |
Show() | Displays form without blocking other windows |
ShowDialog() | Opens form modally and waits for response |
| Constructor Parameters | Pass data into a form when creating it |
| Public Properties | Expose form data for retrieval after close |
โ Best Practices
- โ Give each form its own class (separation of concerns)
- โ Use constructor injection for required inputs
- โ Use public properties or events to return values
- โ Avoid keeping too many forms open at once
- โ
Clean up form instances using
.Dispose()or.IsDisposed
๐งช Quick Challenge
- Create a new form class
FormAboutwith a label and a Close button. - In
MainForm, add a button to show the About form usingShowDialog() - Try passing the application version into the constructor and displaying it
๐ฌ Want to build a form navigation system, or explore passing objects between forms (like user profiles or models)? Let us know!