2010-12-01 5 views
6

मैंने एक LINQ क्वेरी के साथ एक DataGridView पॉप्युलेट किया है जो एक अनाम प्रकार देता है।DataGridVIew अज्ञात प्रकार के साथ पॉप्युलेट किया गया, फ़िल्टर कैसे करें?

प्रश्न: डेटाग्रिड व्यू को फ़िल्टर करने का कोई मौका जिसका डेटा स्रोत वास्तव में अज्ञात है?

// Setting the datagridview data source 
rawDocumentsDataGridView.DataSource = rawTopics 
    .SelectMany(t => t.Documents) 
     .Select(d => new 
      { 
       DocumentId = d.Id, 
       Rilevante = d.IsRelevant, 
       TopicId = d.Topic.Id // foreign key 
      }).ToList(); 

// Make it not visibile, waiting for master change 
rawDocumentsDataGridView.Visible = false; 

// When master selection changed... 
void rawTopicsDataGridView_SelectionChanged(object sender, System.EventArgs e) 
{ 
    if (rawTopicsDataGridView.CurrentRow == null) return; 

    // Get selected topic id 
    int tid = (int) rawTopicsDataGridView.CurrentRow.Cells["TopicId"].Value; 

    // Filter rawDocumentsDataGridView based on topic id 
    // WARNING: PSEUDO CODE 
    var oldDataSource = (List<AnonymousType>)rawDocumentsDataGridView.DataSource; 
    rawDocumentsDataGridView.DataSource = oldDataSource 
     .Where(d => d.TopicId == tid); 
} 

उत्तर

7

तुम क्या कर कि (टीका) रखें "डेटा स्रोत = DataSource.Where (...)" आप बार-बार अंदर फ़िल्टर किए गए डेटा को छानने जा रहे हैं; लेकिन इस मामले में मैं करूंगा:

एक: फिर से उपयोग के लिए एक क्षेत्र, और

ख में सूची संग्रहीत: हमें नहीं एक गुमनाम प्रकार

class DocumentRow { 
    public int DocumentId {get;set;} 
    public bool Rilevante {get;set;} 
    public int TopicId {get;set;} 
} 
... 
List<DocumentRow> allData; 
... 
allData = rawTopics.SelectMany(t => t.Documents) 
    .Select(d => new DocumentRow 
     { 
      DocumentId = d.Id, 
      Rilevante = d.IsRelevant, 
      TopicId = d.Topic.Id // foreign key 
     }).ToList(); 
... 
rawDocumentsDataGridView.DataSource = allData 
    .Where(d => d.TopicId == tid).ToList(); 
+0

हाँ मैं गलत था, मैं पहले से फ़िल्टर किए गए डेटा को फ़िल्टर करने जा रहा था। ये सही है। लेकिन मैं जानना चाहता हूं कि अनाम प्रकारों के साथ इसे कैसे करना है ... – gremo

+1

@Gremo - वहाँ * एक चाल है जिसे कास्ट-बाय-उदाहरण कहा जाता है, लेकिन यह वास्तव में इसके लायक नहीं है। गंभीरता से; यहां एक अनाम प्रकार का प्रयोग न करें। वे केवल तभी समझते हैं जब डेटा का उत्पादन उसी संदर्भ में किया जाता है और उपभोग किया जाता है (या केवल * प्रतिबिंब जैसे चीजों द्वारा उपयोग किया जाता है)। यह मामला यहां नहीं है। आप प्रतिबिंब के माध्यम से फ़िल्टरिंग भी कर सकते हैं, लेकिन यह धीमा * और * भंगुर है। –

+0

ठीक है, मैं मैदान का पर्दाफाश करूंगा। मैं प्रतिबिंब के बारे में आपसे सहमत हूं ... यह मूल्यवान नहीं है ... – gremo

संबंधित मुद्दे