2009-04-14 13 views
0

Ich habe eine Funktion, die LINQ-Ergebnisse an die Steuerelemente in meinem Formular bindet. Der folgende Code funktioniert, aber ich komme einfach nicht über das Gefühl, dass ich für den Copy/Paste-Aspekt geschlagen werden sollte. Kann mir jemand helfen, was ich tun muss, um das zu desodorieren?Refactoring-Methode, die Steuerelemente an LINQ bindet

Vielen Dank!

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; 
    } 

Antwort

3

Ich weiß nicht, ob das wirklich alles löst aber versuchen:

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; 
    } 
} 

So können Sie die Informationen wie folgt ziehen:

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

Danke, das scheint auf dem richtigen Weg zu sein. Meine mag "dieses" nicht. "Extension-Methode kann nur in nicht-generische, nicht verschachtelte statische Klasse deklariert werden" Ideen ?? –

+0

Ja, Sie müssen es in einer statischen Klasse deklarieren. öffentliche statische Klasse MyExtensions {(hier einfügen)} –

0

Sie können 'verkürzen' durch, etwas zu tun:

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

} 

Und dann:

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

Sie sind nicht übergeben die Tabelle überhaupt –

+0

Oh nein, Ende der friggen Welt, füllen Sie diese Lücken Nick ... – leppie

+1

Nun, es macht den ganzen Unterschied, warum gehen durch die Anstrengung der tatsächlichen C# und dann anrufen es Pseudo-Code? –

1

Der Trick besteht darin, die Informationen zu speichern, die erforderlich sind, um die Steuerelemente explizit zu binden. Sie können eine IDictionary<Control, Int32> erstellen, um die Kategorie-ID für jedes Steuerelement zu speichern. Dann iteriere einfach über alle Kontrollen, suche die ID im Wörterbuch nach und binde sie schließlich, wenn ein Eintrag existiert. Sie können diese Methode erweitern, indem Sie ein Dictionary mit Delegaten als Werten erstellen. Auf diese Weise können Sie verschiedene Abfragen für verschiedene Steuerelemente ausführen. Weiter könnten Sie auch die Control.Tag Eigenschaft verwenden, um diese Information zu speichern.

Verwandte Themen