Zer0
Zer0

Reputation: 1022

Updating Control From Different Form

I've got a Main Form (frm_Main) and Settings Form (frm_Settings) and I would like to update a control, which is in frm_Main, from frm_Settings. So far I've tried adding a method in frm_Main and then accessing that from frm_Settings in hopes for it to work but it did't. Here is the code for my current method:

Main Form

public partial class frm_Main : Form
{
    public frm_Main()
    {

    }

    public void ChangeBackColor(Color color)
    {
        richTextBox.BackColor = color;
    }
}

Settings Form

public partial class frm_Settings : Form
{
    public frm_Settings()
    {

    }

    private void pbcl_editorBackColor_Click(object sender, EventArgs e)
    {
        ColorDialog editorBackColor = new ColorDialog();
        if (editorBackColor.ShowDialog() == DialogResult.OK)
        {
            Variables.Editor_BackColor = "#" + editorBackColor.Color.ToArgb().ToString("X");
            Color colour = ColorTranslator.FromHtml(Variables.Editor_ForeColor);
            var Main = new frm_Main();
            Main.ChangeBackColor(colour);
        }
    }
}

Upon click the 'OK' button on the ColorSelectorDialog, nothing happens, there is no update whatsoever. What am I doing wrong here?

Upvotes: 0

Views: 34

Answers (1)

M. Nasir Javaid
M. Nasir Javaid

Reputation: 5990

Try this

Settings.cs

public partial class frm_Settings : Form
{
    private frm_Main _main;
    public frm_Settings(frm_Main main)
    {
          _main = main;
    }

    private void pbcl_editorBackColor_Click(object sender, EventArgs e)
    {
        ColorDialog editorBackColor = new ColorDialog();
        if (editorBackColor.ShowDialog() == DialogResult.OK)
        {
            Variables.Editor_BackColor = "#" + editorBackColor.Color.ToArgb().ToString("X");
            Color colour = ColorTranslator.FromHtml(Variables.Editor_ForeColor);                
            _main.ChangeBackColor(colour);
        }
    }
}

Main.cs

public partial class frm_Main : Form
{
    public frm_Main()
    {

    }
    private void LaunchSetting()
    {
       var settings = new frm_Settings(this);
       settings.ShowDialog();
    }
    public void ChangeBackColor(Color color)
    {
        richTextBox.BackColor = color;
    }
}

EDIT:

We can also handle it to create an event

Settings.cs

public partial class frm_Settings : Form
{
    public delegate void ColorChangedHandler(Color color);
    public event ColorChangedHandler OnColorChangedHandler;
    public frm_Settings()
    {

    }

    private void pbcl_editorBackColor_Click(object sender, EventArgs e)
    {
        ColorDialog editorBackColor = new ColorDialog();
        if (editorBackColor.ShowDialog() == DialogResult.OK)
        {
            Variables.Editor_BackColor = "#" + editorBackColor.Color.ToArgb().ToString("X");
            Color colour = ColorTranslator.FromHtml(Variables.Editor_ForeColor);
            if (OnColorChangedHandler != null)
            {
               OnColorChangedHandler(colour);
            }
        }
    } 
}

Main.cs

public partial class frm_Main : Form
{
    public frm_Main()
    {

    }
    private void LaunchSetting()
    {
       var settings = new frm_Settings(this);
       settings.OnColorChangedHandler += OnColorChanged;
       settings.ShowDialog();
    }
    private void OnColorChanged(Color color)
    {
       ChangeBackColor(color);
    }
    public void ChangeBackColor(Color color)
    {
        richTextBox.BackColor = color;
    }
}

Upvotes: 1

Related Questions