.NET GUI

.NET Community für WPF, Silverlight und mehr!
Willkommen bei .NET GUI. Anmeldung | Registrieren | Hilfe | Impressum | Forumsregeln
in Suchen

LINQ Abfrage filtern bei Ereignis

Letzter Beitrag 12-07-2008 12:06 von lbm1305. 5 Antworten.
Seite 1 von 1 (6 Treffer)
Beiträge sortieren: Zurück Weiter
  • 12-03-2008 21:35

    • lbm1305
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10-01-2008
    • Leipzig
    • Beiträge 48
    • Punkte 820

    LINQ Abfrage filtern bei Ereignis

    Hallo,

    ich beschäftige mich seit einiger Zeit auch mit LINQ. Doch seit ein paar Tagen stehe ich vor einem Problem. Folgender Augangspunkt.
    Ich habe eine LINQ Abfrage als DataSource an ein DataGridView gehangen. Nun möchte ich per ComboBox (oder auch bei Eingabe in eine Textbox) die Abfrage nochmals filtern.

    Bei ADO.NET konnte ich ja über ein DataView nochmals filtern. Sowas ähnliches suche ich für LINQ.


    Ist das relaisierbar? Und wenn ja wie?
    Ich hab noch schon mehrmals die große Suchmaschine befragt, aber irgendwie nichts gefunden (oder aber übersehen). Embarrassed

    Vielen Dank im voraus
    Beste Grüße
    André
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 12-04-2008 14:08 Antwort zu

    AW: LINQ Abfrage filtern bei Ereignis

    Mache doch einfach noch eine Abfrage und setzte dann die DataSource der Abfrage. Die Frage: Wie sieht deine Datenquelle aus? Ich nehme für solche Zwecke immer eine Klasse und nutze die Generics: In einem aktuellen Fall habe ich folgendes gemacht:

    Gegeben:
    public class DbFeld
    {		
    	public string Name { get; private set; }
    	public string Beschreibung { get; private set; }
    	public string Bereich { get; private set; }
    	public string Mapping { get; set; }
    	public Produkt Produkt { get; set; }
    }

    Über ein Repository, dass mir die Daten aus einer XML einliest habe ich dann eine List von Felder, also List<DbField>.
    Auf diese Datenquelle führe ich dann den Filter per LINQ durch und setze die Datenquelle neu.

    Mein Initilaisierungscode zum Laden der Datenquelle sieht initial so aus:

    public ConverterForm (FieldRepository<DbField> repository)
    {
        InitializeComponent ();
        InitGrid ( dataGridView );
    
        _dbFelder = repository.Load();
        dataGridView.DataSource = _dbFelder;
    }

    Und zum Filtern in deinem ClickEventHanlder dann folgender Code:
    Filter( x => x.Name == txtName.Text );


    der dann diese ausführt:
    protected void Filter(Predicate<DbField> predicate )
    {
        dataGridView.DataSource = from feld in _dbFelder
                              where predicate(feld)
                              select feld;
    }
    Bei einem Reset des Filters kannst du dann einfach die alte Datenquelle wieder herstellen:

    dataGridView.DataSource = __dbFelder
    Wenn du das ganze noch schöner machen willst kannst du dir dafür einen Controller bauen den du generisch für jedes Grid und jede Datenquelle einsetzen kannst, die IEnumerable<T> unterstützt.

    der ungefähr so aussiet:

    public class DataGridViewFilterController<TDataRow>
    {
    	DataGridView dataGridView;
    	IEnumerable<TDataRow> dataSource;
    	public DataGridViewFilterController ( DataGridView dataGridView, IEnumerable<TDataRow> dataSource )
    	{
    		this.dataSource = dataSource;
    		this.dataGridView = dataGridView;
    	}
    
    	public void Filter ( Predicate<TDataRow> predicate )
    	{
    		dataGridView.DataSource = from dataRow in dataSource
    								  where predicate ( dataRow )
    								  select dataRow;
    	}
    
    	public void Reset ()
    	{
    		dataGridView.DataSource = dataSource;
    	}
    }
    


    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 12-04-2008 20:36 Antwort zu

    • lbm1305
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10-01-2008
    • Leipzig
    • Beiträge 48
    • Punkte 820

    AW: LINQ Abfrage filtern bei Ereignis

    Danke für die Antwort. Ich werde mich mal durch den für mich noch leicht unverständlichen Code arbeiten. Smile
    Beste Grüße
    André
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 12-05-2008 21:20 Antwort zu

    • lbm1305
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10-01-2008
    • Leipzig
    • Beiträge 48
    • Punkte 820

    AW: LINQ Abfrage filtern bei Ereignis

    Moin,

    So...ich habe mich durch den obigen Code mal durchgearbeitet. Dennoch habe ich eine weitere Frage:
    Derzeit hab ich ein Projekt, in dem ich DataGridView mit Hilfe 3er Comboboxen filtern möchte. Wie kann man das am besten anstellen.

    Für einen zweiten Filterschritt bräuchte ich das Resultat aus der ersten Abfrage. Oder sollte ich da eher Abstand nehmen, weil es nicht sinnvoll erscheint?

    Danke im voraus
    Beste Grüße
    André
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 12-06-2008 18:54 Antwort zu

    AW: LINQ Abfrage filtern bei Ereignis

    Mit meiner obigen Controller Klasse, kannst du diese Filterungen kaskadieren, d.h. immer auf die nächste DataSource einen neuen Filtercontroller einbauen. Wir zwar vom Resourcenverbrauch höher, aber es funktioniert erst einmal. Andere Lösung hab ich adhoc nicht parat.

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 12-07-2008 12:06 Antwort zu

    • lbm1305
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10-01-2008
    • Leipzig
    • Beiträge 48
    • Punkte 820

    AW: LINQ Abfrage filtern bei Ereignis

    Rainer Schuster:
    , d.h. immer auf die nächste DataSource einen neuen Filtercontroller einbauen.


    Hallo Rainer,

    stimmt, ich hatte da wohl einen Denkfehler bzw. wohl nicht richtig gelesen Embarrassed
    Beste Grüße
    André
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
Seite 1 von 1 (6 Treffer)
Powered by Community Server (Commercial Edition)    69° - Internet-Agentur München (CMS, ASP.NET, Webdesign)