我控制在C#的Visual Studio 2012中-一种“快速查找”文本框进行过滤datagridview的。它应该为3种类型的datagridview的数据源:数据表,数据绑定和数据集。 我的问题是从DataSet对象,这是显示在DataGridView中筛选DataTable中。 有可能为3例(实例与DataGridView控件和文本框就可以了标准的WinForm应用程序)-前2个工作好了,我的问题与第三之一: 1。 datagridview.DataSource=dataTable的:它的工作原理 这样我就可以通过设置过滤:dataTable.DefaultView.RowFilter=“国家LIKE'%S%'”;
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.DataSource=BindingSource的:它的工作原理 这样我就可以通过设置过滤:bindingSource.Filter=“国家LIKE'%S%'”;
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.DataSource=的dataSource; datagridview.DataMember=“这是行不通的 当你设计一个设计师发生了:把数据集从工具箱的表单,添加的DataTable,然后设置datagridview.DataSource=的dataSource;和datagridview.DataMember=“ 下面的代码假装这些操作:
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()); }
如果你测试它-虽然数据表进行筛选(ds.Tables [0] DefaultView.Count变化),datagridview的不更新... 我一直在寻找一个长期的任何解决方案 CodeGo.net,但问题是,数据源不能改变-因为它是额外的控制,我不想要的代码它。 我知道可能的解决方案是: -从数据绑定它作为例子2绑定的DataTable:但它直到在代码编写, -改变数据源到BindingSource的,dataGridView.DataSource=dataSet.Tables [0],或[预设编程:但是,它改变了数据源。因此,解决办法:
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()); }
是不能接受的,因为你在MessegeBox'es的dataSource正在改变看... 我并不想这样做,它类似于这个可能写的代码:
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 }
他能做到这一点,因为他设计的DataGridView与DataSet和数据成员的设计师。 代码将howewer,一个过滤器,它会抛出一个excepcion ... 所以,问题是:我怎么可以筛选的DataTable的DataSet中,并显示在DataGridView中的结果,而不改变数据源到另一个?为什么我可以筛选直接从例1的DataTable,而从DataSet中的DataTable过滤不工作? 也许这不是数据表在这种情况下绑定到DataGridView中? 请注意,我的问题,需要从设计的问题,因此解决方案必须在例3。
-------------------------------------------------------------------------------------------------------------------------
1. 我只花了一个小时了类似的问题。答案竟然是令人尴尬的简单。
(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter = string.Format("Field = '{0}'", textBoxFilter.Text);
2. 你可以从你的数据源创建一个DataView对象。这将允许您在不直接修改源筛选和排序数据。 此外,调用dataGridView1.DataBind();后您设置数据源。
3. 我开发了一个通用的应用过滤器:
string rowFilter = string.Format("[{0}] = '{1}'", columnName, filterValue);
(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = rowFilter;
方括号允许在列的空间 此外,如果你想要在你的过滤器多个值,你可以添加下面一行,每增加值:
rowFilter += string.Format(" OR [{0}] = '{1}'", columnName, additionalFilterValue);
4. 我有一个问题,如果我说 Dataview.RowFilter=“输入MyColumn='”+MYDATA +“'”;其中MYDATA为字符串值,mydate的具有值“可以这样做”; 这工作得很好。 但如果MYDATA有值“不能这样做”; 然后它抛出在过滤器错误说语法错误。这是字符串引用的“在我的字符串 “输入MyColumn='灿*'* T做到这一点'”; 如何在一个字符串忽略单蛮'