C# 在不创建新实例的情况下从类访问form方法

C# 在不创建新实例的情况下从类访问form方法,c#,methods,delegates,controls,C#,Methods,Delegates,Controls,我最近对我的项目做了一点修改,加入了一个接口,以实现更好的集成,但这意味着要改变一些原本在主窗体上的方法,而不是其他类。我真的很纠结于如何从继承自接口的类访问主窗体(用于更新窗体控件)上的方法。下面是一些代码片段,这些代码应该有助于提高清晰度 首先,这是我在主窗体上的方法,它更改窗体控件并位于主窗体上 //main form public partial class BF2300 : Form { public void setAlarmColour(byte[] result, int but

我最近对我的项目做了一点修改,加入了一个接口,以实现更好的集成,但这意味着要改变一些原本在主窗体上的方法,而不是其他类。我真的很纠结于如何从继承自接口的类访问主窗体(用于更新窗体控件)上的方法。下面是一些代码片段,这些代码应该有助于提高清晰度

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

//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移动到表单会使我能够访问表单控件,这是真的,但随后我无法访问该方法本身,因此我的境况实际上没有好转

最好的方法是使用事件。否则,如果它是父窗体,则可以使用户

((MainForm)currentform.Parent).SetAlarmColor()

活动:

 public delegate void SetDelegate(byte[] result, int buttonNumber);
        public event SetDelegate SetAlarmColor;
在您的子类中创建委托和事件

Child child = new Child();

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

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

您可以将
setAlarmColor
方法声明为静态,只需从界面调用
BF2300.SetAlarmMethod

你能说得更具体一点吗..newConnect是用child编写的,主要形式是??经过这么长时间后,仍然对解决方案感兴趣吗?处理这一问题的两个标准习惯用法是简单地向调用类传递对表单类的引用(简单但不灵活),或者在调用类中声明事件并让表单类订阅它(稍微复杂一些,但灵活得多)。请参阅这两个示例的答案。如果它解决了您的问题,请将此问题作为另一个问题的副本关闭。如果没有,请编辑您的问题,解释这有什么不同,以及您具体需要哪些帮助。您能告诉我需要使用哪种类型的活动吗?我已经使用了几个事件,不知道是否可以将其集成到其中一个事件中。但我仍然不太清楚您的要求..可能高于帮助u,但是这样的事情会变得无效,因为它位于主窗体上,所以我无法在此实例化。只需设置一个线程和一个委托,委托方法应该是运行颜色更改任务的人,而静态方法应该实例化并启动线程,这样就可以开始了。