2009-04-14 7 views
0

LINQ 결과를 양식의 컨트롤에 바인딩하는 함수가 있습니다. 아래의 코드는 작동하지만 필자는 복사/붙여 넣기 측면에서 부딪히는 느낌을 극복 할 수 없습니다. 이 냄새 제거를 위해 내가해야 할 일을 도와 줄 수 있습니까?컨트롤을 LINQ에 바인딩하는 리팩터링 메서드

감사합니다! 다음

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

} 

그리고 :

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

을 시도 :

이렇게 정보를 가져올 수 있습니다 :

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... 
} 
+0

고마워, 이건 바른 길에있는 것 같아. 내 것은 "이"를 좋아하지 않습니다. "확장 메서드는 비 제네릭, 중첩되지 않은 정적 클래스에서만 선언 할 수 있습니다." 아이디어? –

+0

그래, 정적 클래스에서 선언해야합니다. public static class MyExtensions {(여기에 넣으십시오)} –

0

당신은 같은 일을하여 '단축'수있는이 정말 아무것도하지만 해결되는지 모르겠어요

chkDomains.DataSource = GetDescriptions(6); 
... 
+0

전혀 테이블을 전달하지 않고 있습니다. –

+0

friggen 세계가 끝나고, 그 틈새를 채우십시오. – leppie

+1

글쎄요, 모든 차이를 만들어냅니다. 왜 실제 C#을 만들고 나서 전화를 걸어야합니까? 의사 코드? –

1

트릭은 컨트롤을 명시 적으로 바인딩하는 데 필요한 정보를 저장하는 것입니다. IDictionary<Control, Int32>을 만들어 각 컨트롤의 카테고리 ID를 저장할 수 있습니다. 그런 다음 모든 컨트롤을 반복하고 사전에서 ID를 찾은 다음 항목이 있으면 바인드합니다. 위임자를 값으로 사용하여 사전을 만들어이 메서드를 확장 할 수 있습니다. 이렇게하면 다른 컨트롤에 대해 서로 다른 쿼리를 수행 할 수 있습니다. 또한 Control.Tag 속성을 사용하여이 정보를 저장할 수도 있습니다.