2017-11-29 3 views
1

DataSourceがBindingSourceのときにDataGridViewをフィルタリングしようとしています。 BindingSourceでフィルタを変更しようとすると、BindingSource.Filter値だけが変更されますが、DGVは同じように見えます。私のDGVをフィルタリングする方法は?ここでBindingSourceとDataGridViewのフィルタリング

BindingSource udalosti = new BindingSource(); 
//filling bindingsource by udalosti.Add() 
eventDataGridView.DataSource = udalosti; 

は私のフィルタリング機能は、これは、コンテンツが最も簡単な方法ですので、あなたがIBindingListViewを実装する必要はありませんDataTableを使用して

class Udalost 
{ 
    public string Typ { get; set; } 
    public string Popis { get; set; } 
    public string Zdroj { get; set; } 
    public DateTime Cas { get; set; } 
} 
+0

は、データソースがIBindingListViewをサポートしていますか?そうでない場合は、BindingSourceのFilter機能を利用できません。 –

+0

ドキュメントには、https://msdn.microsoft.com/cs-cz/library/system.windows.forms.bindingsource.filter(v=vs.110).aspx –

+0

@HynekBernardはありません。いいえ、 t。 [BindingSource.Filterプロパティ](https://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter(v = vs.110).aspx) - **備考**抜粋: * "IBindingListViewインタフェースを実装している基本的なリストのみがフィルタリングをサポートしています。" * –

答えて

1

をどのように見えるかです

string filter=""; 
if (typeComboBox.Text != "") 
{ 
    filter = "Typ LIKE '" + typeComboBox.Text + "' AND "; 
} 
if (descriptionTextBox.Text != "") 
{ 
    filter += "Popis LIKE '%" + descriptionTextBox.Text + "%' AND "; 
} 
if (sourceTextBox.Text != "") 
{ 
    filter += "Zdroj LIKE '" + sourceTextBox.Text + "' AND "; 
} 
if (filter.Length > 0) 
    udalosti.Filter = filter.Substring(0, filter.Length - 5); 
else 
    udalosti.Filter = filter; 
eventDataGridView.ResetBindings(); 

です。

enter image description here

CS:

public partial class Form1 : Form 
{ 
    MyDataTable dt; 
    BindingSource bs; 

    public Form1() 
    { 
     InitializeComponent(); 

     dt = new MyDataTable(); 
     bs = new BindingSource(); 
     bs.DataSource = dt.DefaultView; 
     dataGridView1.DataSource = bs; 
    } 

    private void buttonAdd_Click(object sender, EventArgs e) 
    { 
     var r = new Random(); 
     var dr = dt.NewRow(); 
     dr[0] = r.Next(1111, 9999); 
     dr[1] = r.Next(1111, 9999); 
     dr[2] = r.Next(1111, 9999); 
     dt.Rows.InsertAt(dr, 0); 
    } 

    private void buttonRemove_Click(object sender, EventArgs e) 
    { 
     dt.Rows.RemoveAt(0); 
    } 

    private void buttonClear_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = 
     textBox2.Text = 
     textBox3.Text = string.Empty; 
     UpdateDgv(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     UpdateDgv(); 
    } 

    private void textBox2_TextChanged(object sender, EventArgs e) 
    { 
     UpdateDgv(); 
    } 

    private void textBox3_TextChanged(object sender, EventArgs e) 
    { 
     UpdateDgv(); 
    } 

    private void UpdateDgv() 
    { 
     string filter = GetFilter(); 

     if (filter != string.Empty) 
      this.Text = filter; 
     else this.Text = "All records"; 

     bs.Filter = filter; 
    } 

    private string GetFilter() 
    { 
     string filter = string.Empty; 

     if (textBox1.Text != string.Empty) 
      filter = string.Format("Data1 like '{0}%'", textBox1.Text); 

     if (textBox2.Text != string.Empty) 
     { 
      if (textBox1.Text != string.Empty) 
       filter += " and "; 
      filter += string.Format("Data2 like '{0}%'", textBox2.Text); 
     } 

     if (textBox3.Text != string.Empty) 
     { 
      if (filter != string.Empty) 
       filter += " and "; 
      filter += string.Format("Data3 like '{0}%'", textBox3.Text); 
     } 

     return filter; 
    } 
} 

のDataTable:

public class MyDataTable : DataTable 
{ 
    public MyDataTable() 
    { 
     Columns.Add("Data1", typeof(string)); 
     Columns.Add("Data2", typeof(string)); 
     Columns.Add("Data3", typeof(string)); 

     DataRow dr; 
     var r = new Random(); 
     for (int i = 0; i < 1000; i++) 
     { 
      dr = NewRow(); 
      dr["Data1"] = r.Next(1111, 9999); 
      dr["Data2"] = r.Next(1111, 9999); 
      dr["Data3"] = r.Next(1111, 9999); 
      Rows.Add(dr); 
     } 
    } 
} 
関連する問題