winforms 如何从另一个线程中的静态方法更改窗体属性?

6vl6ewon  于 2023-02-24  发布在  其他
关注(0)|答案(2)|浏览(147)

有件事我一直在努力实现,我真的陷进去了。我将从头开始:我有一个包含两个窗体的项目,mainlogin
登录表单非常简单,它只要求用户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表单中时,可能会有更多登录尝试(例如,由于连接丢失和重新连接)
所以,总结一下,问题是:如何从可能位于不同线程中的静态方法更改窗体属性(或该窗体中任何控件的属性)?
我什么都试过了,但每次我试的时候都会犯错误。谷歌似乎也没有试图帮助我。谢谢你的帮助,非常感激。

w7t8yxp5

w7t8yxp51#

如果不调用调度程序,则无法从工作线程更新GUI。请参阅此处:How to update the GUI from another thread in C#?

ekqde3dh

ekqde3dh2#

如果我没理解错的话,你可以按下面的方法做.

((FormMain)Application.OpenForms["FormMain"]).methodInMain(parameter);

相关问题