2010-12-01 4 views
6

Ich habe ein DataGridView mit einer LINQ-Abfrage gefüllt, die einen anonymen Typ zurückgibt.DataGridVIEW mit anonymen Typ gefüllt, wie zu filtern?

Frage: Gibt es eine Chance, das DataGridView zu filtern, dessen Datenquelle tatsächlich anonym ist?

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

Antwort

7

Wenn Sie zu halten, dass (paraphrasieren) tun „Datasource = DataSource.Where (...)“ Sie wiederholt innerhalb die gefilterten Daten werden wollen Filterung; aber in diesem Fall würde ich:

a: Speichern der Liste in einem Feld für die Wiederverwendung, und

b: nicht uns ein anonymer Typ

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

Ja, ich war falsch, ich wollte bereits gefilterte Daten filtern. Stimmt. Aber ich würde sowieso gerne wissen, wie man das mit anonymen Typen macht ... – gremo

+1

@Gremo - da ist * ein Trick, der "cast-by-example" genannt wird, aber das ist es wirklich nicht wert. Ernst; Verwenden Sie keinen anonymen Typ hier. Sie machen nur dann Sinn, wenn die Daten im selben Kontext produziert und konsumiert werden (oder nur von Dingen wie Reflektion genutzt werden). Dies ist hier nicht der Fall. Sie können die Filterung auch über Reflektion durchführen, aber das ist langsam * und * spröde. –

+0

Gut, ich werde das Feld aussetzen. Ich stimme dir mit Reflektion zu ... es ist nicht wert ... – gremo

Verwandte Themen