C# 使用线程从子窗体更新父窗体

C# 使用线程从子窗体更新父窗体,c#,winforms,C#,Winforms,我对如何处理这个问题有点困惑 我有一个包含DataGridView的父窗体和一个用于输入帐户创建详细信息的子窗体 在帐户创建表单上,当用户创建帐户时,它会启动一个线程,并在网站上注册该帐户。每次创建帐户时,我都希望: 1) 将其添加到数据库中。我假设这就像创建一个连接并插入它一样简单。这可以从子表单中完成吗?i、 e.数据库是否可在全球访问 2) 是否更新父窗体上的dataGridView 需要注意的是,子窗体是使用form.showDialog()调用的,我想这会导致无法更新父窗体?我应该使用

我对如何处理这个问题有点困惑

我有一个包含DataGridView的父窗体和一个用于输入帐户创建详细信息的子窗体

在帐户创建表单上,当用户创建帐户时,它会启动一个线程,并在网站上注册该帐户。每次创建帐户时,我都希望:

1) 将其添加到数据库中。我假设这就像创建一个连接并插入它一样简单。这可以从子表单中完成吗?i、 e.数据库是否可在全球访问

2) 是否更新父窗体上的dataGridView

需要注意的是,子窗体是使用form.showDialog()调用的,我想这会导致无法更新父窗体?我应该使用form.show()吗

做我想做的事情的传统方式是什么


谢谢

您的数据库访问不限于一个特定的表单-因此,您可以从子表单插入数据库。正如Dotnebee所说,您可以使用委托更新父窗体:

public partial class MainForm : Form
{
    public MainForm ()
    {
        InitializeComponent();
    }
    private void btnAccount_Click(object sender, EventArgs e)
    {
        AccountForm objAccountForm = new AccountForm();
        objAccountForm.CreateAccount+= new ChangeStatusHandler(objAccountForm_CreateAccount);
        objAccountForm.Show();
    }
    public void objAccountForm_CreateAccount(string accountName)
    {
        //Add account to grid.
    }
}

public delegate void CreateAccountHandler(string accountName);
public partial class AccountForm: Form
{
    public event CreateAccountHandler CreateAccount;

    public AccountForm()
    {
        InitializeComponent();
    }

    private void btnCreate_Click(object sender, EventArgs e)
    {
        ...
        //Create your account.
        ...
        if (CreateAccount!= null)
        {
            CreateAccount(txtAccountName.Text);
        }
    }
}
如果要返回的内容多于帐户名称,只需更改CreateAccountHandler签名以返回account类,或者创建一个包含所有所需属性的EventArgs类


如果创建帐户可能需要很长时间,并且您需要在线程上执行此操作,请使用BackGroundWorker,然后在回调方法中调用CreateCount委托,而不是在按钮单击事件中调用该委托。

您所需要的只是对子窗体中父窗体的引用。为父窗体的任何类型的子窗体创建一个私有类变量。创建此表单时,请使用set方法设置父表单。您应该能够从中更新网格。如果您想使用Delgates,您可以使用Delgates实现通信。