如何在C#中从另一个cs文件访问表单对象

7
在form.cs文件中,我有两个按钮,一个备忘录和一个计时器。我的问题是:如何从另一个cs文件访问计时器或备忘录?我尝试将对象设为public,但没有成功,请给我一个源或一个项目,这样我就可以看到我错在哪里。谢谢!

那个其他的cs文件在同一个项目里吗? - Jon B
5个回答

16

在设计器中选择您的按钮,进入其属性并将 "Modifiers" 属性从 "Private" 更改为 "Public"。

然后您就可以从另一个类访问它,类似于以下方式:

public static class Test
{
    public static void DisalbeMyButton()
    {
        var form = Form.ActiveForm as Form1;

        if (form != null)
        {
            form.MyButton.Enabled = false;
        }
    }
}

注意:这只是一个例子,绝对不是良好设计的模式 :-)


1
抛出新的 StackOverflowException(); ;) - Mehrdad Afshari
它抛出了一个错误,我已经标记了错误的位置。不起作用。 - Ivan Prodanov
你已经编辑了你的答案,我已经尝试过了。当我尝试写"Form1.MyButton"时,它无法识别它。 - Ivan Prodanov
@John:请看下面我的回答。在.NET中,表单的工作方式与VB6中的不同。 - Jon B
@John,请尝试重新编译您的应用程序。 - Konstantin Tarkus
1
将“Modifiers”属性从“private”更改为“public”是此答案的关键部分。 - prabhakaran

6
在Program.cs中已经有一个Form对象实例,只是没有引用。通过简单的编辑,您可以转换它。
Application.Run(new Form1());

to

Application.Run(formInstance = new Form1());

声明一个变量的方式如下

public static Form1 formInstance;

并使用

Program.formInstance.MyFunction(params);

我喜欢这种方法,它使得顶层窗体始终可用。我曾经遇到过ActiveForm指向错误窗体的问题(从我的代码角度来看是错误的,但根据所有常规逻辑来说是正确的)。 - Khainestar

6
每当我听到有人谈论“另一个 .cs 文件”或“另一个 .vb 文件”时,我都会感到担忧。它经常(虽然不总是)表明缺乏编程理解,至少是面向对象编程。文件中有什么?一个类?两个?
你试图从一个类的方法(或者可能是VB中的模块)中访问这些内容,而不是从另一个文件访问它们。
你的问题的答案将取决于你正在尝试访问这些内容的类和方法的性质,以及你想要访问它们的原因。
一旦你编辑你的问题以包括这些信息,你得到的答案可能会告诉你,除了窗体类本身,你不应该在其他类中访问这些私有部分。

3
我怀疑问题远比物业的可见性更深层次。 - tvanfosson

1

虽然我同意John Saunders的观点,但你可能做错了一件事情,那就是假设你可以通过公共修饰符访问所有内容,但你没有该表单的实例。

例如,以下是您应该这样做的方式:

Form1 myForm = new Form1;
string theButtonTextIAmLookingFor = myForm.MyButton.Text;

我猜你可能试图像静态访问它一样访问它,就像这样:

string theButtonTextIAmLookingFor = Form1.MyButton.Text;

这是你可能想要检查的内容。


0

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