Instantiating and Managing Custom C# Form Classes

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.cs
    • FormSettings.Designer.cs
    • Partial class FormSettings that inherits from Form

๐Ÿงช 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

ConceptDescription
Custom Form ClassYour own class inheriting from Form
Show()Displays form without blocking other windows
ShowDialog()Opens form modally and waits for response
Constructor ParametersPass data into a form when creating it
Public PropertiesExpose 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

  1. Create a new form class FormAbout with a label and a Close button.
  2. In MainForm, add a button to show the About form using ShowDialog()
  3. 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!