Data Binding + Relation + Filtering
-
Hey,
ich würde gerne eine Suchfunktion in mein Projekt einbauen. Leider kriege ich das nicht gelöst, da ich auch Relationen verwende und ich es einfach nicht schaffe ein BindingSource zu verwenden ohne die gesamte Funktionalität zu zerstören.
Hier mein Code:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { InitData(); } void InitData() { string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=../../Test.mdb"; using (OleDbConnection con = new OleDbConnection(strCon)) { con.Open(); DataSet ds = new DataSet(); using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Kunde", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Kunde"); } } using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Auftrag", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Auftrag"); } } using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Leistung", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Leistung"); } } ds.Relations.Add("RelAuftrag", ds.Tables["Kunde"].Columns["id_Kunde"], ds.Tables["Auftrag"].Columns["KundenNr"]); ds.Relations.Add("RelLeistungen", ds.Tables["Auftrag"].Columns["id_Auftrag"], ds.Tables["Leistung"].Columns["AuftragNr"]); cbKunde.DataSource = ds; cbKunde.ValueMember = "Kunde.id_Kunde"; cbKunde.DisplayMember = "Kunde.Nachname"; txtVorname.DataBindings.Add("Text", ds, "Kunde.Vorname"); txtNachname.DataBindings.Add("Text", ds, "Kunde.Nachname"); dgvAuftrag.DataSource = ds; dgvAuftrag.DataMember = "Kunde.RelAuftrag"; dgvLeistung.DataSource = ds; dgvLeistung.DataMember = "Kunde.RelAuftrag.RelLeistungen"; con.Close(); } } private void txtFilter_TextChanged(object sender, EventArgs e) { // TODO } } }
Wie gesagt funktioniert das alles ganz wunderbar. Jedoch soll das DataGridView dgvLeistung gefiltert werden. Wie gehe ich am besten vor ohne die Relation kaputt zu machen?
Danke im Voraus
-
Ich habe es geschafft
Man muss einige Binding Source miteinander verketten und die Relationen als DataMember setzen, um das korrekte Verhalten zu erreichen.
Hier mein Code für die Nachwelt:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace Test { public partial class Form1 : Form { BindingSource bsKunde = new BindingSource(); BindingSource bsAuftrag = new BindingSource(); BindingSource bsLeistung = new BindingSource(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { InitData(); } void InitData() { string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=../../Test.mdb"; using (OleDbConnection con = new OleDbConnection(strCon)) { con.Open(); DataSet ds = new DataSet(); using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Kunde", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Kunde"); } } using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Auftrag", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Auftrag"); } } using (OleDbCommand selectCmd = new OleDbCommand("SELECT * FROM tbl_Leistung", con)) { using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCmd)) { dataAdapter.Fill(ds, "Leistung"); } } ds.Relations.Add("RelAuftrag", ds.Tables["Kunde"].Columns["id_Kunde"], ds.Tables["Auftrag"].Columns["KundenNr"]); ds.Relations.Add("RelLeistungen", ds.Tables["Auftrag"].Columns["id_Auftrag"], ds.Tables["Leistung"].Columns["AuftragNr"]); bsKunde.DataSource = ds; bsKunde.DataMember = "Kunde"; cbKunde.DataSource = bsKunde; cbKunde.ValueMember = "id_Kunde"; cbKunde.DisplayMember = "Nachname"; txtVorname.DataBindings.Add("Text", bsKunde, "Vorname"); txtNachname.DataBindings.Add("Text", bsKunde, "Nachname"); bsAuftrag.DataSource = bsKunde; bsAuftrag.DataMember = "RelAuftrag"; dgvAuftrag.DataSource = bsAuftrag; bsLeistung.DataSource = bsAuftrag; bsLeistung.DataMember = "RelLeistungen"; dgvLeistung.DataSource = bsLeistung; con.Close(); } } private void txtFilter_TextChanged(object sender, EventArgs e) { bsLeistung.Filter = String.Format("Leistung LIKE '%{0}%'", txtFilter.Text); } } }