【问题标题】:Updating Control From Different Form从不同的表单更新控件
【发布时间】:2015-07-13 03:42:49
【问题描述】:

我有一个主窗体 (frm_Main) 和设置窗体 (frm_Settings),我想从 frm_Settings 更新一个位于 frm_Main 中的控件。到目前为止,我已经尝试在 frm_Main 中添加一个方法,然后从 frm_Settings 访问它,希望它能够工作,但它没有。这是我当前方法的代码:

主窗体

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

    }

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

设置表单

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);
        }
    }
}

单击 ColorSelectorDialog 上的“确定”按钮后,没有任何反应,也没有任何更新。我在这里做错了什么?

【问题讨论】:

    标签: c# user-interface controls updates


    【解决方案1】:

    试试这个

    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;
        }
    }
    

    编辑:

    我们也可以处理它来创建一个事件

    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;
        }
    }
    

    【讨论】:

    • 您应该解释它为什么起作用。它相当简单,应该很容易解释。
    • @deathismyfriend 这是每个初始阶段开发人员的常见错误,他们创建新实例以使用某些东西而不是使用现有的。在设置颜色之前的这个问题中,他在主窗体上创建了从未显示的新对象
    • 我知道这很常见,因为我曾经遇到过这个问题。但是向某人展示解决方案而不是解释解决方案然后向他们展示是不同的。有些人只有在事情得到解释时才会学习。最好进行简短的解释,以便未来的观众更好地了解解决方案和他们所犯的错误。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2020-04-19
    相关资源
    最近更新 更多