从表单访问main中的实例

时间:2012-12-13 23:55:21

标签: c# forms class instance

/ *您好我正在尝试在visual studio上制作我的第一个c#应用程序。我在main中创建了一个类和该类的实例,我只是试图在窗体上的click事件中查询该实例的成员,但它告诉我实例名称在当前上下文中不存在。任何帮助将不胜感激这里是我的代码。         * /

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {

     public class character         // this is my class
        {
            public bool hair_black;
        }


        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());

                character deviljin = new character();  // instance of my class

                deviljin.hair_black = true;      // initiating a member of the instance


            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {


        public partial class Form1 : Form
        {

            int cs1 = 0,cs2=0;


            public Form1()
            {
                InitializeComponent();


            public void pictureBox1_Click(object sender, EventArgs e)
            {

                flowLayoutPanel1.Visible = true;
                if (deviljin.hair_black == true)   // trying to access instance member
                {                                  // but getting deviljin does not
                                                   // exist in the current context
                    pictureBox28.Visible = false;
                }            

            }

        }
    }

3 个答案:

答案 0 :(得分:1)

您的实例变量deviljin是main方法的本地变量,不能在该方法之外直接引用。

您需要在您尝试使用它的Form1实例中传递引用。 这可以通过form1

的构造函数直接传递引用来完成
 Application.Run(new Form1(deviljin));

当然,将Form1的构造函数更改为

private character _devReferenceToCharacterPassed

public Form1(character mycharInstance)
{
    _devReferenceToCharacterPassed = mycharInstance;
    InitializeComponent();
}

现在您可以在点击代码中使用传入的实例

public void pictureBox1_Click(object sender, EventArgs e)
{
    flowLayoutPanel1.Visible = true;
    if (_devReferenceToCharacterPassed.hair_black == true)   
    {                                  
         pictureBox28.Visible = false;
    }            
}

还要注意

  

Application.Run(new Form1(deviljin));

是一个阻止通话。这意味着在Form1打开之前,您的代码不会退出此调用,因此您需要在Run调用之前移动deviljin变量的创建。

编辑:我强烈反对在整个应用程序中使用具有全局可见性的变量。有时它们是必要的,但它们会导致很快创建不可维护的代码。最好学习使用尽可能少的全局变量进行编程

答案 1 :(得分:1)

这是因为错误所说的 - 实例在当前上下文中不存在(表单的上下文)

这是一个范围问题 - 您声明的每个变量都有一个范围,因为您在Main类的Program方法的本地范围内声明了您的字符类实例,它只会显示在那种方法中。

由于Program类是静态的,你可以在该类上创建一个静态成员,例如:

namespace WindowsFormsApplication10
{

 public class character         // this is my class
    {
        public bool hair_black;
    }


    static class Program
    {
        public static character deviljin;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

编辑:并没有真正注意到这一点,但正如史蒂夫指出的那样,虽然这会编译,如果你在实例化变量之前调用Application.Run,​​你会在尝试时遇到运行时异常访问它(它将为null)所以请确保在Application.Run

之前执行此操作
            deviljin = new character();  // instance of my class

            deviljin.hair_black = true;      // initiating a member of the instance

            Application.Run(new Form1());


        }
    }
}

这样您就可以通过Program类访问您的实例:

        public void pictureBox1_Click(object sender, EventArgs e)
        {

            flowLayoutPanel1.Visible = true;
            if (Program.deviljin.hair_black == true)   
            { 
                pictureBox28.Visible = false;
            }            

        }

阅读变量范围,访问修饰符和静态/实例变量 - 对于一个非常简单的项目,静态变量可以正常,这样你就可以在学习的同时走这条路线

答案 2 :(得分:1)

您需要更新表单以将Character的实例作为参数,例如

public partial class Form1 : Form
{
    private Character _character;
    public Form1(Character character)
    {
        _character = character;
    }

    public void pictureBox1_Click(object sender, EventArgs e)
    {
        If (_character.hair_black)
        {
             ...
        }
    }
}
...
var deviljin = new Character()
{
    hair_black = true
};
Application.Run(new Form1(deviljin));