使用Form1的公共变量

时间:2015-08-31 05:21:27

标签: c# winforms

基本上,我的程序会将您带入带有套接字的游戏中,一旦您登录,“控制面板”按钮就会出现修改游戏中的一些内容,比如在游戏中发送消息。 “控制面板”按钮通过新表单显示所有这些功能。我现在将为您提供Form1打开Form2的代码片段。

private void cpanel_btn_Click(object sender, EventArgs e)
{
    Form2 cPanel = new Form2();
    cPanel.Show();
}

正如您所看到的,它会调出Form2。我试图让Form2与Form1进行通信。基本上,Form2可以与Form1进行通信,只要运行简单的空白(函数) - 但这就是全部。这是Form2的构造函数类。我给它起了公共名称“Main”,并设置了“public Form1 main”。在Form2的类的顶部。这是Form2的全班。

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form1 Main;

        public Form2()
        {
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            InitializeComponent();
            this.Main = new Form1();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Main.sendGameData("Hello world!");
        }
    }
}

正如您所看到的,此类底部的按钮的void尝试与Form1通信并发送一些数据。但是,它运行该函数,但让我们看一下Form1的“sendGameData”void。

    public void sendGameData(string data)
    {
        data += "\x00";
        byte[] game_data = Encoding.UTF8.GetBytes(data);
        if (this.log_packets_opt) this.log("[SENT]: " + data);
        this.game_socket.Send(game_data);
    }

它运行该函数,但它似乎遇到了该空白的底线错误。 Form2无法运行sendGameData,因为它没有“game_socket”公共套接字。这是一个很大的问题,因为它阻止了我的代码工作。在发生任何重大事件之前,game_socket被分配到Form1中,我不想重建它,因为它会重叠套接字并使你必须重新连接和填充。

我想知道如何让Form2完全访问Form1,并拥有已经设置的所有It公共变量。

哦,我收到的错误是:对象引用未设置为对象的实例。

1 个答案:

答案 0 :(得分:1)

您正在Form2中创建Form1的新实例,而不是将Form2的实例传递给Form2。这样做:

private void cpanel_btn_Click(object sender, EventArgs e)
{
    Form2 cPanel = new Form2(this);
    cPanel.Show();
}

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form1 Main;

        public Form2(Form1 main)
        {
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            InitializeComponent();
            this.Main = main;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Main.sendGameData("Hello world!");
        }
    }
}