Filtreleme veri kaynağı değiştirmeden DataGridView
C Kullanıcı Kontrol geliştiriyorum# 2010 - "hızlı bul" datagridview filtreleme için textbox. bir nevi Visual Studio Datagridview veri kaynakları 3 tür için çalışması gerekir: DataTable, Veri bağlama ve veri Kümesi. Benim sorunum DataGridView üzerinde görüntülenen veri Kümesi nesnesi DataTable filtreleme ile.
3 olgu (DataGridView ve TextBox ile standart WinForm uygulama örnekleri) olabilir - ilk 2 TAMAM çalışma, 3 kişi ile sorunum var:
1. datagridview.Veri kaynağı = dataTable : çalışır
ayarlayarak filtre de: dataTable.DefaultView.= "Country LİKE '%% s"; .' RowFilter
DataTable dt = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Swiss" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
dataGridView1.DataSource = dt;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " dataGridView1.DataSource.GetType().ToString());
dt.DefaultView.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " dataGridView1.DataSource.GetType().ToString());
}
2. datagridview.Veri kaynağı = bindingSource: çalışır
ayarlayarak filtre de: bindingSource.= "Country LİKE '%% s"; .' filtre
DataTable dt = new DataTable();
BindingSource bs = new BindingSource();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Swiss" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
bs.DataSource = dt;
dataGridView1.DataSource = bs;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " dataGridView1.DataSource.GetType().ToString());
bs.Filter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " dataGridView1.DataSource.GetType().ToString());
}
3. datagridview.Veri kaynağı = veri kaynağı; datagridview.= "": Çalışmıyor . TableName DataMember
Tablo tasarımcısını kullanarak tasarım olur: form üzerinde araç Kümesi koymak, bunun için dataTable eklemek ve sonra datagridview.Veri kaynağı = veri kaynağı; datagridview.= "". TableName DataMember
Kod aşağıda bu işlemleri miş:
DataSet ds = new DataSet();
DataTable dt = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Swiss" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
ds.Tables.Add(dt);
dataGridView1.DataSource = ds;
dataGridView1.DataMember = dt.TableName;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " dataGridView1.DataSource.GetType().ToString());
//it is not working
ds.Tables[0].DefaultView.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " dataGridView1.DataSource.GetType().ToString());
}
Eğer datatable (ds.süzülmüş olmasına rağmen test ederseniz - Tablolar[0].DefaultView.Değişiklik sayısı), datagridview güncelleme... Herhangi bir çözüm için uzun zamandır arıyordum, ama sorun bu değildirVeri kaynağı değiştiremezsinizek kontrol olarak, programcı kod ile uğraşmak istemiyorum.
Olası çözümler olduğunu biliyorum:
ama kod yazma sırasında programcı. - örnek 2 veri Kümesi Veri bağlama kullanarak DataTable bağlamak için bunu kullanın: ^br>
- veri kaynağı BindingSource, dataGridView değiştirin.Veri kaynağı = veri kümesi.Tablolar[0], veya programlama yoluyla DefaultView: ancak, veri Kaynağı değişiyor. Bu yüzden çözüm:
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
dataGridView1.DataSource = dv;
MessageBox.Show("DataSource type AFTER = " dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
}
kabul edilebilir değil, MessegeBox altılı gördüğünüz gibi veri kaynağı değişiyor
Buna benzer bir kod yazmak progemmer mümkün değil, çünkü bunu yapmak istemiyorum:
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
DataSet dsTmp = (DataSet)(dataGridView1.DataSource); //<--- it is OK
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
dataGridView1.DataSource = dv; //<--- here the source is changeing from DataSet to DataView
MessageBox.Show("DataSource type AFTER = " dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
dsTmp = (DataSet)(dataGridView1.DataSource); //<-- throws an exception: Unable to cast object DataView to DataSet
}
Tasarımcısı veri Kümesi ve DataMember ile DataGridView tasarladığı gibi, o olabilir. Kod derlenmiş olacak, ancak bir filtre kullandıktan sonra, bir excepcion atmak olacaktır
Yani soru şu: nasıl bir filtre Kümesi içinde DataTable ve başka bir veri Kaynağı değiştirmeden DataGridView sonuçlarını gösterebilir miyim? Örnekte DataTable 1 doğrudan filtre yapabilirim Neden, kümesinden DataTable çalışmıyor filtreleme ise? Belki DataTable bu durumda DataGridView için lidir değil mi?
Benim sorunum çözüm örnek 3 üzerinde ÇALIŞMAK GEREKİR bu yüzden tasarım sorunları alır, unutmayın lütfen.
CEVAP
Ben sadece benzer bir sorun üzerinde bir saat geçirdim. Benim için cevap beni utandıracak kadar basit olduğu ortaya çıktı.
(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter = string.Format("Field = '{0}'", textBoxFilter.Text);
Veri kaynağı sunucu tarafı veri belleğ...
Nasıl Bahar JNDI veri Kaynağı tarafınd...
Nasıl verileri kullanan XmlReader veya...
UİPageViewController, nasıl düzgün sip...
Ne XML Hizmet Başvuru .dosya veri kayn...