从类访问表单方法而不创建新实例

本文关键字:新实例 创建 实例 访问 访问表 表单 方法 | 更新日期: 2023-09-27 18:35:28

我最近对我的项目进行了一些更改,以包含一个接口以更好地集成,但这意味着移动一些最初在主窗体上的方法而不是其他类。我真的坚持如何从我的接口继承的类访问我的主窗体(用于更新窗体控件)上的方法。下面是一些代码片段,应该有助于清晰。

首先,这是我在主窗体上的方法,它更改窗体控件并位于我的主窗体上。

//main form
public partial class BF2300 : Form
{
public void setAlarmColour(byte[] result, int buttonNumber)
    {
        if (result != null)
        {
            this.Invoke((MethodInvoker)delegate
            {
                if (result[4] == 0x00)
                {
                    this.Controls["btn" + buttonNumber].BackColor = Color.Green;
                }
                else
                {
                    this.Controls["btn" + buttonNumber].BackColor = Color.Red;
                }

            });
        }
    }
 }

最后是我的类方法,它需要访问这个:

//class which needs to access method in main form
class bf2300deviceimp : IdeviceInterface
{
 public void start(string address, int port, int i)
    {
        if (timer == null)
        {
            timer = new System.Timers.Timer(1000);

            timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { timerElapsed(sender, e, address, port, i); };
        }
        timer.Enabled = true;
        // MessageBox.Show("Thread " + i + " Started.");
    }

    public void timerElapsed(object sender, ElapsedEventArgs e, string address, int port, int i)
    {
        this.newconnect(address, port, i);
    }

   public void newconnect(string address, int port, int buttonNumber)
    {
        try
        {
            byte[] result = this.newSendCommandResult(address, port, bData, 72);
           // needs to access it here.
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

任何建议将不胜感激。我只是不知道如何做到这一点。我不能简单地创建主窗体的新实例,因为我需要引用当前窗体。起初,我认为将setAlarmColor移动到窗体上会使我可以访问窗体控件,这是真的,但是后来我无法访问方法本身,所以我真的没有好到哪里去。

从类访问表单方法而不创建新实例

最好的方法是使用事件。否则如果是父表单,则可以使用

(主窗体)当前窗体。父级)。设置警报颜色()

事件:

 public delegate void SetDelegate(byte[] result, int buttonNumber);
        public event SetDelegate SetAlarmColor;

在您的孩子班级中制作代表和活动。

Child child = new Child();
     child.SetAlarmColor += new Child.SetDelegate(child_SetAlarmColor);

在创建子窗体时使用该事件

您可以将setAlarmColour方法声明为静态方法,只需从接口调用BF2300.SetAlarmMethod即可。