SORU
30 NİSAN 2011, CUMARTESİ


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
6 NİSAN 2012, Cuma


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • Numberphile

    Numberphile

    15 EYLÜL 2011