当数据源是列表(C#)时,通过文本框过滤DataGridView

时间:2018-07-30 20:09:32

标签: c# list filter datagridview

我正在尝试创建一个文本框样式过滤器,该过滤器将允许我在dataGridView表中仅显示具有选定匹配条件的一行。

enter image description here

该表当前已通过数据源绑定到列表对象。

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;

但是似乎未应用过滤器(主要是由于基于列表的 BindingSource 不是 IEnumerable

b)通过将我的数据源转换为数据表,然后使用RowFilter功能

private void searchId_TextChanged(object sender, EventArgs e)
{
    (dataGridView3.DataSource as DataTable).DefaultView.RowFilter = 
    string.Format("npcId='{0}'", searchId.Text);
}

但是这给了我对象引用未设置为对象的实例。错误,因为它似乎无法将dataGridView强制转换为DataTable。

我的想法真的用光了,我想知道是否有人可以帮忙^^。

1 个答案:

答案 0 :(得分:1)

我猜您可能是在说“搜索”而不是“过滤器”。如果您想在用户键入字符后立即“搜索”某些内容,则在大多数情况下,当用户在文本框中键入单个字符时,将触发searchId_TextChange事件。在这种情况下,似乎代码正在从单个字符“过滤”“ Id”。除非表中有一个单元格等于用户键入的值(在本示例中因为单个字符而没有),否则这很可能使用户处于“空”状态,因为过滤器将不返回任何匹配项。

因此,由于您似乎只想显示一行,所以直到用户键入“完全”完整的数字后,该行才会出现。在应用过滤器之前,可能要等到用户键入了x个字符后,这才是有益的。或者只是在文本框旁边添加一个“搜索”按钮。我猜这可能对用户更友好。

最后,为了帮助您,下面是两个示例,其中将List<T>DataTable用作两个DataSources的{​​{1}},我将假设DataGridViews属性NpcDropID。在此示例中,intID。在int示例中,DataTable被定义为ID。添加几个文本框,表单可能如下所示。

enter image description here

左侧的网格具有string作为数据源。右侧的网格使用List<NcpDrop>作为DataTable。最初DataSourcefullNPCDropsList用相同的数据填充。连接了两个文本框gridTable事件以“过滤”网格。

TextChanged应用“过滤器”时,将创建一个新的List<NcpDrop> List<NcpDrop>,并用所有匹配的filterList填充。这个新的ID用作网格List<NcpDrop>

将“过滤器”应用于DataSource时,将从初始DataTable创建一个新的DataView filterData并将DataTalbe应用于RowFilter基于文本框中的内容。然后,此DataView用作网格的“数据源”。

从下面的图片可以看出,在用户键入“全”数字之前,左网格将保持“空”。另一方面,当用户键入更多字符时,右侧的网格将过滤列表项。右侧的网格显示所有带有五(5)位数字的“ 20102”项目。直到用户键入第六(6)个数字,左侧的网格将保持空白。

enter image description here

总而言之,从用户的角度来看,确切的要求是什么以及什么是最佳方法尚不清楚。如果用户正在搜索一个数字,而数据是一个数字,我想您将需要做更多的工作,因为如果不使用等号,小于号,大于号等,此功能将不可用。

DataView

希望这会有所帮助。