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