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

时间:2012-05-28 09:43:22

标签: c# methods delegates controls

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

首先,这是我的主窗体上的方法,它改变了表单控件并位于我的主窗体上。

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

    }
}

任何建议都会非常感激。我只是坚持如何做到这一点。我不能简单地创建我的主表单的新实例,因为我需要引用当前表单。起初我认为将setAlarmColour移动到表单会使得我可以访问表单控件,这是真的,但后来我无法访问方法本身所以我真的没有好转。

2 个答案:

答案 0 :(得分:0)

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

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

在创建子表单时使用该事件

答案 1 :(得分:0)

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