2011-11-02 32 views
2

我對如何解決這個問題有點困惑。從線程的兒童更新父窗體

我有一個父窗體包含一個DataGridView和一個子窗體,用於輸入一些帳戶創建的細節。

在帳戶創建表單上,當用戶創建一個帳戶時,它啓動一個線程並在該網站上註冊該帳戶。每次創建帳戶時,我都想:

1)將其添加到數據庫。我認爲這與創建連接並插入它一樣簡單。這可以從兒童形式完成嗎?即全局可訪問的數據庫?

2)更新父窗體上的dataGridView?

重要的是要注意,使用form.showDialog()調用子窗體,我認爲更新父窗體不可能?我應該使用form.show()嗎?

做我想做什麼的傳統方式是什麼?

感謝

+1

所有你需要的是在你的子表單中對父窗體的引用。爲您的父表單的任何類型的子表單創建一個私有類變量。當您創建此表單時,請使用set方法來設置父表單。你應該能夠從中更新網格。 – Akron

+0

如果要使用Delgates,則可以使用該功能實現通信。 –

回答

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委託,而不是在按鈕單擊事件中。

+0

+1爲簡單的解釋。 – Pankaj