有件事我一直在努力实现,我真的陷进去了。我将从头开始:我有一个包含两个窗体的项目,main和login。
登录表单非常简单,它只要求用户id和密码。当表单加载时,它连接到服务器,当用户键入这些内容并单击login时,它向服务器发送一个登录请求。这是两个表单加载方式的示例。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();
}
我需要的是login来拥有一个对象(子对象)来访问main,main来拥有一个对象(父对象)来访问login。Google不会告诉我一种方法来做到这一点,所以我不得不发挥我的想象力。如果有更好的方法来实现这一点,我会很高兴听到它。
正如你所看到的,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;
}
}
如果你问自己:如果login
表单已经可见,为什么需要为login
表单再次设置visible=true
?-当用户已经登录并处于main
表单中时,可能会有更多登录尝试(例如,由于连接丢失和重新连接)
所以,总结一下,问题是:如何从可能位于不同线程中的静态方法更改窗体属性(或该窗体中任何控件的属性)?
我什么都试过了,但每次我试的时候都会犯错误。谷歌似乎也没有试图帮助我。谢谢你的帮助,非常感激。
2条答案
按热度按时间w7t8yxp51#
如果不调用调度程序,则无法从工作线程更新GUI。请参阅此处:How to update the GUI from another thread in C#?
ekqde3dh2#
如果我没理解错的话,你可以按下面的方法做.