2012-12-20 190 views
1

我正在創建一個用戶控件,並且我希望它對我的數據庫類一無所知。C#函數指針

但是,我需要該數據庫類的某些功能(我需要根據員工編號獲取員工姓名)。

我想要做的是在我的用戶控件中創建一些東西,我可以在我的應用程序中使用它,就像我會連接一個Click事件或類似的東西。我從來沒有在C#項目中實際創建過類似的東西,所以我不知道該怎麼稱呼它。我會想象它必須存在。

我想在我的數據庫類要調用的函數有這樣的簽名:

public string GetEmployeeName(int employeeNumber); 

有人能告訴我這是什麼,我想幹什麼?

如果這是困難的,一個例子也會很好。

+1

是否要訂閱活動? –

回答

3

您可以使用代理來完成此操作,例如, Func<TArgument, TResult>;

公共字段添加到您的用戶控件:

//A method that has an int parameter and returns a string 
public Func<int, string> GetEmployeeName; 

在用戶控件,當你需要得到員工的姓名,你可以使用委託:

string employeeName; 
if (GetEmployeeName != null) 
    employeeName = GetEmployeeName(employeeNumber); 

您可以設置委託託管頁面或正在進行的控制:

myUserControl.GetEmployeeName = GetEmployeeName; 
+0

+1到目前爲止,汗先生,你的版本是唯一編譯的版本。 – jp2code

4

我想你想要做的是使用delegate

+0

太棒了,Nate!我知道這一定很簡單。 – jp2code

+0

我會對此進行擴展。使用委託在實例化時將方法傳遞給用戶控件。該方法是知道關於數據庫的。用戶控件應該調用這個方法,不知道它做了什麼,並且可以根據方法返回的任何值進行操作。 – tomfanning

+0

我試着創建一個靜態委託,因爲我將在同一個窗體上有大約10個這些用戶控件,但是我得到了**不可調用的成員不能像方法一樣使用。**我想我必須爲每個實例,然後。 – jp2code

2

如果您的控件需要調用一個lo在數據庫上進行業務操作我建議您編寫一個接口併爲其實施一個實例。

+0

聽起來不錯,但我不確定如何創建也包含自己的代碼的界面。我不會像往常一樣經常沿着這條路走下去。有沒有這樣的例子? – jp2code

+1

@ jp2code接口不能有任何代碼,但UserControl會「知道」接口,而數據庫類將「實現」接口。這樣你的UserControl引用的是接口而不是你的類,但仍然可以調用你的類的代碼。另請參閱:http://msdn.microsoft.com/zh-CN/library/87d83y5b(v=vs.110).aspx – Nate