Используйте делегат для отображения данных в другой форме

У меня есть форма, которая эмулирует виртуальную (экранную) клавиатуру с DataGridView. Эта форма находится в библиотеке, которую я хочу отделить от уровня данных. Как я могу передать этой форме метод поиска в базе данных и вернуть DataTable, который я могу отобразить в форме?

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

Как я буду использовать делегата в этой форме?

EDIT: я не очень ясно выразился в своем исходном вопросе, поэтому немного отредактировал:

В MainForm() у меня есть метод Search, подобный этому:

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

Я хочу передать этот метод в AlphaKeypad(), чтобы он обрабатывался следующим образом: когда пользователь нажимает некоторые клавиши, я хочу вызвать функцию Search() с введенным текстом и отобразить в dridview AlphaKeypad возвращенную DataTable из базы данных.

Надеюсь, теперь это ясно.

Спасибо!


person H Mihail    schedule 14.12.2015    source источник


Ответы (2)


Просто напишите такой метод

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);
}
person Oliver    schedule 14.12.2015
comment
Не компилируется, получаю The type or namespace Func<String, FataTable> could not be found - person H Mihail; 14.12.2015
comment
@HMihail: полное имя (без использования операторов) будет System.Func<System.String, System.Data.DataTable>. Для типа DataTable необходимо добавить ссылку на System.Data. - person Oliver; 15.12.2015

person    schedule
comment
Смогу ли я также контролировать строку поиска, созданную виртуальной клавиатурой? Я забыл упомянуть об этом в вопросе. - person H Mihail; 14.12.2015
comment
Делегат является ссылкой на обычный метод (функцию). Вы можете делать все, что хотите в методе. - person TcKs; 14.12.2015
comment
Я добавил некоторые детали, так как я все еще запутался. Не могли бы вы проверить это? - person H Mihail; 14.12.2015