基本上,我的程序会将您带入带有套接字的游戏中,一旦您登录,“控制面板”按钮就会出现修改游戏中的一些内容,比如在游戏中发送消息。 “控制面板”按钮通过新表单显示所有这些功能。我现在将为您提供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公共变量。
哦,我收到的错误是:对象引用未设置为对象的实例。
答案 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!");
}
}
}