从类中调用表单上的函数

时间:2016-06-24 16:08:56

标签: c# class

我正在努力从Toolkit类调用一个方法。

我经常需要构建使用类似功能的项目。 为了让自己更容易,我目前正在将很多这些函数放在一个我可以在所有项目中轻松使用的类中。我正在使用的一个功能是在我的表单中添加一个statusstrip。

我已经设法从我的表单中获取了statusstrip,但现在我正在尝试从我的课程中更新我的statusstrip上的工具标签,这就是我被卡住的地方。我正在尝试调用toolstriplabel甚至是一种方法来更新表单上的标签,但它无法识别表单。

这就是我所拥有的:

namespace Bold
{

public class BoldTools
{
    private Form frmMain;

    public BoldTools(Form parent)
    {
        frmMain = parent;
    }

    public void test()
    {
        if (frmMain.lblThreadStatus.InvokeRequired)
        {
            frmMain.lblThreadStatus.Invoke(new MethodInvoker(delegate
            {
                frmMain.lblThreadStatus.BackColor = Color.FromArgb(R, G, B);
            }));
        }
        else
        {
            frmMain.lblThreadStatus.BackColor = Color.FromArgb(R, G, B);
        }

        frmMain.updateStatusLabel();
    }
}
}
namespace MyMainForm
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }


        // CREATE AN INSTANCE TO THE GENERIC FUNCTIONS
        public Bold.BoldTools tools;

        private void setupTools()
        {
            // LINK THE BOLD CLASS
            tools = new Bold.BoldTools(this);    


            // SET UP THE STATUSES
            tools.Test();
        }
    }
}

此代码基于Stack OverFlow(How to call a method in FORM class from another class but both are same namespace)中的另一个线程,但没有任何运气。 当我使用frmMain时,它无法识别主窗体中的方法。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您正在使用类型Form将表单对象存储在您的类中。然后,编译器将只知道该类中存在的方法,仅此而已。

您要么必须告诉类的实际类型,要么添加包含要在表单上调用的方法的接口。

答案 1 :(得分:0)

您已将frmMain中的成员BoldTools声明为Form。因此,无论何时访问它,编译器只知道Form但不知道frmMain的方法。

将声明更改为:

public class BoldTools
{
    private frmMain _frmMain;

    public BoldTools(frmMain parent)
    {
        _frmMain = parent;
    }

现在,编译器知道您的成员属于frmMain类型,而不仅仅是基类型Form

我在成员名称_frmMain中添加了下划线,以区别于类型名称frmMain

但请注意,frmMain作为类型名称与C#命名约定不匹配。您应该考虑更好的名称,如MainForm或类似的东西。