【发布时间】:2018-07-30 20:09:31
【问题描述】:
我正在尝试创建一个文本框样式过滤器,它允许我在 dataGridView 表中仅显示 1 行具有选定匹配条件的行。
该表当前通过数据源绑定到一个列表对象。
public static List<NpcDrop> npcDrops = new List<NpcDrop>();
//populate npcDrops
dataGridView3.DataSource = Program.npcDrops;
这是这样设置的,因此我可以编辑 dataGridView 中的值,并且底层 npcDrops 列表会在单元格更改时自行更新。该列表稍后会保存回文件中。
因此,我无法将列表转换为 DataTable 或任何其他对象,因为这会破坏 dataGridView 和列表之间的关系。我曾想过将列表更改为 DataTable,然后将其更改回 List 类型,但似乎不太可能。
我尝试过通过各种方式解决问题:
a) 使用 BindingSource
BindingSource bs = new BindingSource();
bs.DataSource = Program.npcDrops;
bs.Filter = "npcId like '201001'";
dataGridView3.DataSource = bs;
但是似乎没有应用过滤器(主要是因为基于 List 的 BindingSource 不是 IEnumerable。
b) 将我的 DataSource 转换为 DataTable,然后使用 RowFilter 功能
private void searchId_TextChanged(object sender, EventArgs e)
{
(dataGridView3.DataSource as DataTable).DefaultView.RowFilter =
string.Format("npcId='{0}'", searchId.Text);
}
然而,这给了我 Object reference not set to an instance of an object. 错误,因为它似乎无法将 dataGridView 转换为 DataTable。
我的想法真的用完了,我想知道是否有人可以提供帮助^^。
【问题讨论】:
-
你不能只使用 ICollectionView 并内置过滤器吗?
-
如果我将列表转换为 ICollectionView,对表进行任何更改都不会反映在我的列表中,这会破坏我在两者之间的双向通信。
-
您是否尝试过使用
BindingList? -
互联网上流传着一个示例,它实际上是 List
数据的 System.Data DataView 的模拟。它允许排序和过滤。我以前在以前的工作中使用过它。我不记得我在哪里找到的。
标签: c# list filter datagridview