用线程从子窗体更新父窗体

本文关键字:窗体 更新 线程 | 更新日期: 2023-09-27 18:13:04

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

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

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

1)将其添加到数据库中。我认为这就像创建连接并插入它一样简单。这可以从子窗体中完成吗?即数据库是否可全局访问?

2)更新父窗体上的dataGridView ?

重要的是要注意,使用form. showdialog()调用子表单,我认为这使得更新父表单不可能?我应该使用form.show()吗?

做我想要达到的目标的常规方法是什么?

谢谢

用线程从子窗体更新父窗体

您的数据库访问不限于一个特定的表单-所以,是的,您可以从子表单进行数据库插入。正如DOTNETBEE所说,您可以通过使用委托来更新父表单:

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签名以返回帐户类或创建一个包含所有属性的EventArgs类。

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