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

を試してみてください。

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

ありがとう、これは正しい軌道にあるようだ。私の趣味は「これ」です。 "拡張メソッドは、非ジェネリックでネストされていない静的クラスでのみ宣言できます" アイデア? –

+0

静的クラスで宣言する必要があります。 public static class MyExtensions {(ここに置く)} –

0

あなたのような何かやってそれを '短くする' ことができ、これは本当に何でもが解決するかどうか、私は知りません

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

あなたはテーブルをまったく通過していません –

+0

ああああ、フリゲゲの世界の終わりは、そのギャップニックを記入してください... – leppie

+1

それは実際のC#を作る努力をして、それは擬似コードですか? –

1

トリックは、コントロールを明示的にバインドするために必要な情報を保存することです。 IDictionary<Control, Int32>を作成して、各コントロールのカテゴリIDを格納することができます。次に、すべてのコントロールを繰り返し処理し、辞書内のIDを調べ、最後にエントリが存在する場合はバインドします。このメソッドを拡張するには、デリゲートを値として持つ辞書を作成します。これにより、異なるコントロールに対して異なるクエリを実行することができます。さらに、Control.Tagプロパティを使用してこの情報を格納することもできます。

関連する問題