文章类型: .NET
关键词: c#,winforms,visual,studio,datagridview,filter,过滤的DataGridView在不改变数据源的分析
内容摘要: datagridview.DataSource=dataTable的:它的工作原理 这样我就可以通过设置过滤:dataTable.DefaultView.RowFilter=“国家LIKE'%S%'”;datagridview.DataSource=BindingSource的:它的工作原理 这样我就可以通过设置过滤:bindingSource.Filter=“国家LIKE'%S%'”;datagridview.DataSource=的dataSource; datagridview.DataMember=“这是行不通的 当你设计一个设计师发生了:把数据集从工具箱的表单,添加的DataTable,然后设置datagridview.DataSource=的dataSource;和datagridview.DataMember=“ 下面的代码假装这些操作:

过滤的DataGridView在不改变数据源的分析

2016/2/4 21:34:48    来源:apple    阅读:

我控制在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做到这一点'”; 如何在一个字符串忽略单蛮'

↑ 上一篇文章:DataGridview 绑定泛型List、BindingList与DataTable的注意要点 关键词:DataGridview,绑定泛型,List,Da.. 发布日期:2016/2/4 20:59:42
↓ 下一篇文章:sqlserver中DATE类型的数据转化 CONVERT 关键词:sql,server,DATE类型,数据转化,CONVERT 发布日期:2016/2/4 23:45:19
相关文章:
C#中对于DataTable的Select筛选用法 关键词:C#,DataTable,Select,DataView,RowFilter 发布日期:2015-07-14 15:46
为Visual Studio添加ildasm工具的方法 关键词:Visual,Studio,vs,添加,ildasm,工具,方法 发布日期:2016-05-06 16:12
实操VS2015配置内存泄漏检查工具Visual Leak Detector 关键词:visual,studio内存泄露,Visual,Leak,Detector 发布日期:2017-10-11 17:10
相关目录:.NET
我要评论
正在加载评论信息......