我有一段时间试图实现,我真的陷入其中。我将从头开始:我有一个项目有两种形式,主要和登录。
登录表单非常简单,只询问用户ID和密码。加载表单时,它连接到服务器,当用户键入表单并单击登录时,它会向服务器发送登录请求。这是两种形式加载的示例。 Program.cs
调用的第一个表单是login:
public static main Child;
private void login_Load(object sender, EventArgs e)
{
Child = new main(this);
}
主要形式以这种方式开始:
public static login Parent;
public main(login parent)
{
Parent = parent;
sck_connect(); // the connection stuff is in this form, the main form
InitializeComponent();
}
我需要的是登录以拥有一个对象(子)来访问main,并且main需要一个对象(父)来访问登录。谷歌不会告诉我这样做的方法,所以我不得不用我的想象力。 如果有更好的方法可以实现这一点,我会很高兴听到它。
正如您所看到的,main
做的第一件事是调用sck_connect()
,此方法将启动与服务器的套接字连接并使其保持活动状态。从现在开始一切正常。
用户单击登录按钮后,登录查询将立即发送到服务器。我们将等待其迅速回复:
IAsyncResult art = connection.BeginReceive(buffer, 0, bufferSize, SocketFlags.None, new AsyncCallback(receivedata_w), connection);
如您所见,当收到一些数据时,会调用方法receivedata_w
。
private static void receivedata_w(IAsyncResult ar)
{
// here some wonderful-working code receiving data
// and storing login query result in -> String instruction
if (instruction == "LoginResultTrue") // login succeded. We hide the login
// and show the main form
{
Parent.Visible = false; // hide the login form
// this.visible = true;
}
if (instruction == "LoginResultFalse") // login error. We hide the main
// form and show the login form
{
Parent.Visible = true; // show the login form
// this.visible = false;
}
}
如果您问自己:为什么如果visible=true
表格已经可见,您需要再次设置login
? - 当用户已登录并以main
形式登录时,可能会有更多登录尝试(例如由于连接丢失和重新连接)
总而言之,问题是:如何从静态方法更改表单属性(或该表单中任何控件的属性)可能在另一个线程中?
我已经尝试了一切,我尝试的一切都给我一个不同的错误。谷歌似乎并没有试图帮助我。谢谢你的帮助,非常感谢。