Метод рефакторинга, который связывает элементы управления с LINQ - PullRequest
0 голосов
/ 15 апреля 2009

У меня есть функция, которая связывает результаты LINQ с элементами управления в моей форме. Приведенный ниже код работает, но я просто не могу избавиться от ощущения, что мне нужно дать пощечину за аспект копирования / вставки. Может ли кто-нибудь помочь мне с тем, что мне нужно сделать, чтобы дезодорировать это?

Спасибо!

private void BindDataToForm()
    {
        // Bind data to form
        CaseNotesDataContext db = new CaseNotesDataContext();
        Table<CN_MaintItem> caseNotesItems = db.GetTable<CN_MaintItem>();

        // For each object
        var contactType = from cType in caseNotesItems
                          where cType.CategoryID == 2
                          select cType.ItemDescription;
        chkContactType.DataSource = contactType;

        var contactLocation = from cLocation in caseNotesItems
                          where cLocation.CategoryID == 3
                          select cLocation.ItemDescription;
        lkuContactLocation.Properties.DataSource = contactLocation;

        var contactMethod = from cMethod in caseNotesItems
                          where cMethod.CategoryID == 4
                          select cMethod.ItemDescription;
        lkuContactMethod.Properties.DataSource = contactMethod;

        var contactWith = from cWith in caseNotesItems
                          where cWith.CategoryID == 5
                          select cWith.ItemDescription;
        chkContactWith.DataSource = contactWith;

        var domains = from d in caseNotesItems
                          where d.CategoryID == 6
                          select d.ItemDescription;
        chkDomains.DataSource = domains;
    }

Ответы [ 3 ]

3 голосов
/ 15 апреля 2009

Я не знаю, действительно ли это что-то решает, но попробуйте:

public static class MyExtentsions {
    public IQueryable<string> GetItemDescriptions(this Table<CN_MaintItem> table, int cat)
    {
        return from x in table
               where x.CategoryID == cat
               select x.ItemDescription;
    }
}

Таким образом, вы можете получить информацию следующим образом:

using (CaseNotesDataContext db = new CaseNotesDataContext()) {
    Table<CN_MaintItem> caseNotesItems = db.GetTable<CN_MaintItem>();

    chkContactType.DataSource = caseNotesItems.GetItemDescriptions(2);
    lkuContactLocation.Properties.DataSource = caseNotesItems.GetItemDescriptions(3);
    // etc... 
}
1 голос
/ 15 апреля 2009

Хитрость заключается в том, чтобы хранить информацию, необходимую для явного связывания элементов управления. Вы можете создать IDictionary<Control, Int32> для хранения идентификатора категории для каждого элемента управления. Затем просто переберите все элементы управления, найдите идентификатор в словаре и, наконец, свяжите его, если запись существует. Вы можете расширить этот метод, создав словарь с делегатами в качестве значений. Это позволяет выполнять разные запросы для разных элементов управления. Кроме того, вы также можете использовать свойство Control.Tag для хранения этой информации.

0 голосов
/ 15 апреля 2009

Вы можете «укоротить» его, сделав что-то вроде:

IQueryable<string> GetDescriptions(int cat)
{
  return from x in caseNotesItems
         where x.CategoryID == cat
         select x.ItemDescription;

}

А потом:

chkDomains.DataSource = GetDescriptions(6);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...