我正在尝试创建一个文本框样式过滤器,该过滤器将允许我在dataGridView表中仅显示具有选定匹配条件的一行。
该表当前已通过数据源绑定到列表对象。
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。
我的想法真的用光了,我想知道是否有人可以帮忙^^。
答案 0 :(得分:1)
我猜您可能是在说“搜索”而不是“过滤器”。如果您想在用户键入字符后立即“搜索”某些内容,则在大多数情况下,当用户在文本框中键入单个字符时,将触发searchId_TextChange
事件。在这种情况下,似乎代码正在从单个字符“过滤”“ Id”。除非表中有一个单元格等于用户键入的值(在本示例中因为单个字符而没有),否则这很可能使用户处于“空”状态,因为过滤器将不返回任何匹配项。
因此,由于您似乎只想显示一行,所以直到用户键入“完全”完整的数字后,该行才会出现。在应用过滤器之前,可能要等到用户键入了x个字符后,这才是有益的。或者只是在文本框旁边添加一个“搜索”按钮。我猜这可能对用户更友好。
最后,为了帮助您,下面是两个示例,其中将List<T>
和DataTable
用作两个DataSources
的{{1}},我将假设DataGridViews
属性NpcDrop
是ID
。在此示例中,int
是ID
。在int
示例中,DataTable
被定义为ID
。添加几个文本框,表单可能如下所示。
左侧的网格具有string
作为数据源。右侧的网格使用List<NcpDrop>
作为DataTable
。最初DataSource
和fullNPCDropsList
用相同的数据填充。连接了两个文本框gridTable
事件以“过滤”网格。
为TextChanged
应用“过滤器”时,将创建一个新的List<NcpDrop>
List<NcpDrop>
,并用所有匹配的filterList
填充。这个新的ID
用作网格List<NcpDrop>
。
将“过滤器”应用于DataSource
时,将从初始DataTable
创建一个新的DataView
filterData
并将DataTalbe
应用于RowFilter
基于文本框中的内容。然后,此DataView
用作网格的“数据源”。
从下面的图片可以看出,在用户键入“全”数字之前,左网格将保持“空”。另一方面,当用户键入更多字符时,右侧的网格将过滤列表项。右侧的网格显示所有带有五(5)位数字的“ 20102”项目。直到用户键入第六(6)个数字,左侧的网格将保持空白。
总而言之,从用户的角度来看,确切的要求是什么以及什么是最佳方法尚不清楚。如果用户正在搜索一个数字,而数据是一个数字,我想您将需要做更多的工作,因为如果不使用等号,小于号,大于号等,此功能将不可用。
DataView
希望这会有所帮助。