在不更改数据源的情况下过滤DataGridView

2024-01-07

我正在 C# Visual Studio 2010 中开发用户控件 - 一种用于过滤 datagridview 的“快速查找”文本框。它应该适用于 3 种类型的 datagridview 数据源:DataTable、DataBinding 和 DataSet。 我的问题是从 DataSet 对象中过滤 DataTable,该对象显示在 DataGridView 上。

可能有 3 种情况(带有 DataGridView 和 TextBox 的标准 WinForm 应用程序的示例) - 前 2 种工作正常,我对第三种情况有问题:

1. datagridview.DataSource = dataTable :它有效
所以我可以通过设置进行过滤: dataTable.DefaultView.RowFilter = "country 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, "Switzerland" });
    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 = "country 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, "Switzerland" });
    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 =“TableName”:它不起作用
当您使用设计器设计表格时会发生这种情况:将工具箱中的数据集放在表单上,​​将数据表添加到其中,然后设置 datagridview.DataSource = dataSource;和 datagridview.DataMember = "TableName"。
下面的代码假装这些操作:

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, "Switzerland" });
    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没有更新...... 我一直在寻找任何解决方案,但问题是数据源不能改变- 因为它是额外的控制,我不希望它弄乱程序员的代码。

我知道可能的解决方案是:
- 使用 DataBinding 从 DataSet 绑定 DataTable 并将其用作示例 2:但这取决于程序员在代码编写过程中,
- 以编程方式将 dataSource 更改为 BindingSource、dataGridView.DataSource = dataSet.Tables[0] 或 DefaultView:但是,它会更改 DataSource。所以解决办法:

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

是不可接受的,正如您在 MessageBox 的 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
}

他可以做到这一点,因为他在设计器中使用 DataSet 和 DataMember 设计了 ​​DataGridView。 代码将被编译,但是,使用过滤器后,它会抛出异常......

所以问题是:如何在不将 DataSource 更改为另一个 DataSource 的情况下过滤 DataSet 中的 DataTable 并在 DataGridView 上显示结果?为什么我可以直接从示例1中过滤DataTable,而从DataSet中过滤DataTable却不起作用? 在这种情况下,也许 DataTable 没有绑定到 DataGridView ?

请注意,我的问题源于设计问题,因此解决方案必须适用于示例 3。


我刚刚花了一个小时来解决类似的问题。对我来说,答案简单得令人尴尬。

(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter = string.Format("Field = '{0}'", textBoxFilter.Text);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不更改数据源的情况下过滤DataGridView 的相关文章

  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • 加快应用程序脚本上的行删除速度

    我编写了这段代码 根据列是否为空来删除空行 代码正在运行并执行其需要执行的操作 但是从包含超过 15k 行的工作表中删除数据需要 10 多分钟数据 有没有办法加快速度 function deleteEmptyRowsAll var shee
  • 为什么 clang 不被更多地使用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Mongodb C# 驱动程序更新所有子数组元素

    我想更新文档并将值设置为子文档数组 使用文档 https docs mongodb com manual reference operator update positional all up S 5B 5D我必须使用 操作员 下列的thi
  • gnuplot 上的相关系数

    我想使用拟合函数绘制数据 function f x a b x 2 绘图后我得到这个结果 correlation matrix of the fit parameters m n m 1 000 n 0 935 1 000 我的问题是 如何
  • Excel 不断加载我的电子表格,但出现错误

    当我加载电子表格时 我不断收到此错误 它让我修复它 这会剥夺所有验证器 该文件保存为 xlsm Excel 在 中发现不可读的内容是否要恢复此工作簿的内容 如果您信任此工作簿的来源 请单击 是 您必须单击 是 否则将无法加载 然后我得到这个
  • 如何在三个 JS 网格中对共面三角形进行分组?

    我正在开发一种建模工具 可以让您直接操作网格 例如 您可以抓住一张脸并将其拖动 用户对 脸 的感知可能是多个共面三角形 例如 立方体的顶 面 实际上是两个三角形 它们被拖到一起形成一个正方形 为了实现这一点 我想收集任何特定三角形的所有共面
  • 通过 zxing 扫描意图传递额外数据

    我正在使用集成条形码扫描仪https github com zxing https github com zxing 我想传递一些额外的数据 uuid下面 以及条形码 Both uuid1 and uuid2低于收益率null 我缺少什么
  • 从 Windows 中删除 pgadmin 4

    我正在使用 pgadmin 4 1 2 它非常慢 我安装了 pgadmin 3 它的效果非常好 如何从 Windows 2008 R2 计算机中删除 pgadmin 4 Kr A H 今天我测试 正如其他答案所说 pgAdmin 如果独立于
  • Angular2 - Google 登录按钮 - 无法读取 null 属性“样式”

    我有 Angular2 应用程序 其中包含登录用户的组件 用户登录后 我立即路由到某个页面 但在控制台中收到几个错误 Uncaught TypeError Cannot read property style of null at G cb
  • 以编程方式滚动 WebBrowser 有时不起作用

    我正在使用System Windows Forms WebBrowser控制 我需要以编程方式滚动 例如 我使用以下代码向下滚动 WebBrowser Document Body ScrollTop WebBrowser Height 问题
  • 同一“if”条件下的两个“==”相等运算符未按预期工作

    我试图建立三个相等变量的相等性 但以下代码没有打印它应该打印的明显正确答案 有人可以解释一下 编译器如何解析给定的if condition 内部 include
  • 如何在R中的stdin中输入EOF?

    我是 R 新手 我想知道如何在 R 的 stdin 中输入 EOF 例如 函数 readLines 从 stdin 读取输入行 但如何告诉它停止 菜鸟问题 感谢大家的关注 附言 问题解决了 但我仍然无法在 StatET Eclipse 的
  • java中@deprecated的逆向是什么[重复]

    这个问题在这里已经有答案了 所以 人们使用 Deprecated https docs oracle com javase 8 docs api java lang Deprecated html已弃用的 API 的注释 如果方法正在演变并
  • 服务“”有零个应用程序(非基础设施)端点

    我不断收到无法解释的异常 Service EmployeeManagerImplementation EmployeeManagerService has zero application non infrastructure endpoi
  • 删除Python中已经打印的内容

    为了练习 我尝试用 Python 做一些事情 我决定制作一个简单的刽子手游戏 我不制作 GUI 游戏将从一个简单的输入 开始 现在 除了要求输入之外 我还想在下一行删除隐藏的单词 我尝试过使用 b 退格字符 但它不起作用 就像是 word
  • Spark 的 Java 17 解决方案 - java.lang.NoClassDefFoundError:无法初始化类 org.apache.spark.storage.StorageUtils

    这里有一些解决方案 Windows Spark 错误 java lang NoClassDefFoundError 无法初始化类 org apache spark storage StorageUtils https stackoverfl
  • GitHub 操作工作流程_调用不使用最新的输入值

    我在 GitHub Action 中遇到了奇怪的行为workflow call 基本上 初始设置后一切正常 但是当我编辑工作流程文件的输入参数时 它不使用更新的值 很难用语言来解释 所以让我给你举个例子 考虑这个基本设置 File 启动管道
  • 有谷歌语音API吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 Google Voice 的 API 官方或非官方 我想要一个 API 来处理语音邮件 发
  • 如何实现随机的重复洗牌 - 但又不太随机

    我有一份清单n项目 我想要一个算法让我从该集合中随机选择一个可能无限的项目序列 但有一些限制 一旦选择了一个项目 它就不应该在接下来的几个项目中再次出现 比如在下一个项目中 m物品 与m显然严格n 您不必等待太长时间才能出现任何项目 项目平
  • 在不更改数据源的情况下过滤DataGridView

    我正在 C Visual Studio 2010 中开发用户控件 一种用于过滤 datagridview 的 快速查找 文本框 它应该适用于 3 种类型的 datagridview 数据源 DataTable DataBinding 和 D