使用委托在另一个表单上显示数据

时间:2015-12-14 12:11:25

标签: c# delegates decoupling

我有一个使用DataGridView模拟虚拟(屏幕上)键盘的表单。这个表单位于一个库中,我想让它与数据层分离。我如何通过这个表单来搜索数据库并返回一个我可以在表单中显示的DataTable?

public partial class AlphaKeypad : Form
{
    public AlphaKeypad(delegate here)
    {
        ...
    }
}

我将如何使用该表单中的委托?

修改 我原来的问题并不是很清楚,所以我编辑了一点:

在MainForm()中,我有一个名为Search的方法,如下所示:

public DataTable Search(string filter)
{
    ...
}

我想将这个方法传递给AlphaKeypad()以便这样处理:当用户按下某些键时,我想用输入的文本调用Search()函数,并在AlphaKeypad的dridview中显示从数据库返回DataTable。

希望现在很清楚。

谢谢!

2 个答案:

答案 0 :(得分:1)

只需编写一个这样的方法

public DataTable FindMatchingElements(String searchTerm)
{
    // ToDo: Search within the database and return a DataTable with the desired results.
}

然后你的AlphaKeypad需要这样的方法:

public class AlphaKeypad
{
    private Func<String, DataTable> _SearchMethod;

    public void SetSearchMethod(Func<String, DataTable> searchMethod)
    {
        _SearchMethod = searchMethod;
    }

    private void OnStartSearching()
    {
        var enteredSearch = GetKeywordsEnteredByUser();
        var dataTable = _SearchMethod(enteredSearch);

        Visualize(dataTable);
    }
}

然后你可以从外部世界做到:

private void InitializeAlphaKeypad()
{
    var alphaKeypad = new AlphaKeypad();
    alphaKeypad.SetSearchMethod(MyDatabaseClass.FindMatchingElements);
}

答案 1 :(得分:0)

public AlphaKeypad(Func<DataTable> func) {
    ....
}

// somewhere else
new AlphaKeypad(()=> return new DataTable());

// or
DataTable FunctionReturningDataTable() {
    return ....;
}
....
new AlphaKeypad(FunctionReturningDataTable); // no brackets means, the function will be passed, not the result of call