我在哪里实例化一个C#表单类,以便它的属性可用于其他类?

时间:2013-06-29 18:36:58

标签: c# winforms

我是C#的初学者,我认为有一些关于实例化和传递引用的基本信息,我只是不知道。

我正在尝试使用默认的Program类来实例化其他2个类,一个名为frmGameUI的表单和一个名为LocHandler的类。如果这正常工作,LocHandler将检查当前位置并分配frmGameUI的文本属性。由于某种原因,在LocHandler中设置属性的方法无法查看或获取我在Program中实例化的frmGameUI的引用。我做错了什么?

static class Program
{
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainUI());

        GameUI frmGameUI = new GameUI();
        frmGameUI.Show();
        LocationHandler LocHandler = new LocationHandler();
        LocHandler.InitializeRoom();
    }

这是LocHandler类:

class LocationHandler
{
    private string currentRoom = "LivingRoom";

    public void InitializeRoom()
    {
        if (currentRoom == "LivingRoom")
        {
            frmGameUI.btnLocation1.Text = "Bedroom";
            frmGameUI.btnLocation2.Text = "Kitchen";
            frmGameUI.btnLocation3.Text = "Patio";
        }
    }
}
在LocHandler中,VS告诉我在这种情况下不存在frmGameUI。我确信有一些基本而简单的东西,我不会在这里掌握。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

是的,你肯定错过了一些基本概念。在C#变量不是全局变量。他们有范围,请参阅:http://msdn.microsoft.com/en-us/library/aa691132(v=vs.71).aspx。在您的情况下,GameUI frmGameUI = new GameUI();的范围是您声明它的方法的局部范围。因此,该方法之外的任何人都无法看到该变量。也就是说,他们无法通过该名称​​看到变量。这并不是说你不能将该变量传递给另一个方法。因此,如果您需要LocationHandler类来处理该变量,那么您可能应该将它传递给InitializeRoom方法。像这样:

LocHandler.InitializeRoom(frmGameUI);

请注意,您的方法签名将更改为:

public void InitializeRoom(GameUI gameui)

然后您在该方法中的代码将引用gameui变量。

///<snip> 
        gameui.btnLocation1.Text = "Bedroom";
        gameui.btnLocation2.Text = "Kitchen";
        gameui.btnLocation3.Text = "Patio";

有意义吗?

答案 1 :(得分:0)

当显示主窗体时,Main方法的执行将在此行停止。

Application.Run(new MainUI());

所以您可能想要做的是将代码移到此行上方创建LocationHandler,然后将其传递给GameUI。 (并将MainUI替换为GameUI

答案 2 :(得分:0)

使用初始化实例创建不同的类,并将它们保存为public's