使用线程更新子窗体中的父窗体

时间:2011-11-02 20:37:18

标签: c# winforms

我对如何解决这个问题感到有些困惑。

我有一个包含DataGridView的父表单,以及一个用于输入帐户创建细节的子表单。

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

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

2)更新父窗体上的dataGridView?

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

实现我想要实现的目标的传统方式是什么?

谢谢

1 个答案:

答案 0 :(得分:2)

您的数据库访问不限于一个特定的表单 - 所以是的,您可以从子表单执行数据库插入。像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委托,而不是在按钮单击事件中。