从另一个静态类访问表单方法

时间:2012-07-02 16:53:36

标签: c# .net forms static

所以,我现在几乎没有线索,甚至不确定它是否可能。 我有一个Visual C#Form,它由Program.cs运行(标准方式 - VS当然完成了所有设置工作)。

除此之外,我在一个单独的C#文件中有一个带静态方法的类,只是因为我喜欢将一个类保存在一个文件中。

我的表单代码有一个公共函数:

public void print(String text)
{
    rtb_log.appendText("\n" + text);
}

在某个时间点,我正在从另一个类调用静态函数。

是否有可能从我的其他课程中实际访问该打印方法?因为它指的是rtb_log(一个富文本框),所以只有实例化才有效,当然也不是静态的。但是因为静态方法只能访问静态成员,所以我在这里有点想法如何在另一个类的表单上附加一些文本。

这里有任何帮助吗?

2 个答案:

答案 0 :(得分:7)

  

但是由于静态方法只能访问静态成员,所以我在这里有一些关于如何在另一个类的表单上附加一些文本的想法。

静态成员可以访问实例成员 - 他们只需要知道调用该方法的实例。所以你可以写:

public static void Foo(OtherForm myOtherForm)
{
    // Do some stuff...
    myOtherForm.Print(); // Case changed to comply with naming conventions
}

然后当您调用方法时,您需要提供对相关表单的引用。基本上某些东西必须确定要调用Print的实例。弄清楚谁拥有这些信息,然后从那里传递信息。我建议反对使用静态变量来保存此信息。 (全局状态使代码不再可重用,更难以推理,并且更难测试。)

编辑:鉴于评论,这听起来像你想要的:

// Within the form
private void HandleClick(object sender, EventArgs e)
{
    SomeClass.StaticMethod(this);
}

答案 1 :(得分:2)

见下文

class SomeMainClass
{
    private ClassB form = null;

    private void SomeMethod()
    {
        form = new ClassB();
        form.Show();
        ClassA foo = new ClassA(this);
    }

    // Use an accessor.
    public ClassB Form
    {
        get { return this.form; }
    }
}

class ClassA
{
    private SomeMainClass mainClass = null;

    // Constructor.
    public ClassA(SomeMainClass _mainClass)
    {
        this.mainClass = _mainClass;
    }

    private void SomeMethod()
    {
        this.mainClass.Form.Print("Something to print");
    }
}

class ClassB : Form
{
    // Constructor.
    public ClassB()
    {
        InitializeComponent();
    }

    public void Print(String text) 
    {     
        rtb_log.appendText("\n" + text); 
    } 
}   

编辑:这是回应您的评论的基本方法。它在资源方面不是那么高效,而是做你想要的......

我希望这会有所帮助。