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

6

所以,我现在基本上已经没有线索了,甚至不确定是否有可能解决。

我有一个Visual C#表单,由Program.cs运行(标准方式 - 当然,VS做了所有的设置工作)。

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

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

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

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

我是否能够访问我的其他类中的那个打印方法?由于它引用了rtb_log(一个rich text box),只有当被实例化时才可用,并且当然不是静态的。 但是由于静态方法只能访问静态成员,因此我在如何从另一个类中附加一些文本到我的表单上方面有些困惑。

这里需要帮助吗?

2个回答

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

当然,但是我如何访问我的主窗体实例呢?我想这才是我真正不太清楚的问题。有没有什么方法可以访问该实例?它是在Program.cs的main方法中使用标准(new Form1())创建的。另外,感谢您指出我的命名约定错误并认真对待我的初学者问题 :) - Eisenhorn
1
@Klausklapper:如果 Program 正在创建一个 new Form1(),那么此时您已经有了对它的引用...但是,是什么调用了您的静态方法呢?换句话说:如果某些东西创建了多个窗体实例,您希望如何知道在哪个窗体实例上调用Print方法? - Jon Skeet
我太傻了,你当然是对的。非常抱歉我这么糊涂。非常感谢你![我会在1分钟内将你的答案标记为正确,因为它不允许我更早地这样做 >:C] - Eisenhorn
@Klausklapper:啊,所以它是在按钮点击事件内?如果是这样,只需传递 this,假设你想要回调到同一个表单。 - Jon Skeet
再次感谢您在如此新手话题上的快速帮助! - Eisenhorn

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

编辑:这是对您评论的基本方法论。从资源效率来看,它并不高效,但可以实现您想要的...

希望这能有所帮助。


很遗憾,它不行。你看,在我的表单(在你的情况下是ClassB)中,它在Program.cs的Main方法中被实例化,就像基本上每个简单的VC# GUI一样。我没有直接的实例名称。或者至少我不知道如何访问它,因为Application.Run(new Form1());没有给我提供一个实例。即使它这样做了,我也不能从我的A类中访问它,对吧? - Eisenhorn
这已经被编辑成类似于您所需的功能。请注意,有更有效的方法来实现这一点 - 但我相信现在这样做就可以了... - MoonKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接