我正在使用com.sencha.gxt(3.0)网格小部件。我正在尝试编写一个Java函数来搜索一行中的字符串(跨所有列)并仅显示包含此字符串的行。是否有内置或简单的方法可以做到这一点?
由于
答案 0 :(得分:1)
没有
(我很确定你实际意味着写一个“是或否”的问题......)
简而言之,GXT假设您的网格中的所有数据都是字符串或字符串,或者仅以字符串方式进行比较是有意义的。另外,您可能在本地拥有所有数据,因此在客户端上执行简单的过滤是有意义的,或者您可能真的在说'请搜索服务器/数据库上的所有一千万行,并且只返回匹配的那些行在客户端上呈现。
Store
(可能是网格的ListStore
或树网格的TreeStore
,但您的问题没有指定)有一个内置的本地过滤方法 - 给它一个函数,它接受一个项(和一些其他可能相关的数据),并返回true / false,指示该项是否应该对用户隐藏。可以应用多个过滤器,如果任何过滤器显示该项目已隐藏,则它将消失。换句话说,这可以被认为是一个sql where
子句,其中所有语句都与and
连接 - 如果你想要or
,你可以实现一个过滤器,检查是否有任何单个过滤器希望该项目可见。
此过滤机制对整个行项T
Store<T>
进行操作。它不知道列是什么,因为您可以以任何方式使用商店 - 组合框中的项目,图表上的点等。它允许您构建自己的工具来执行过滤。如果您的数据通过一种易于了解所有可能列的方式进行推广,那么您可以轻松地在这些列上编写一个循环来检查其中是否有任何一个包含字符串,在这种情况下返回false以便该项是可见的。或者,既然您已经构建了ColumnModel
个ColumnConfig
个,其中每个都有ValueProvider
,并且您知道将每个值与.toString().contains(queryText)
进行比较是有意义的,那么可以通过这种方式遍历列。
在这种情况下,我们几乎无法控制客户端正在发生的事情,因为您很可能将该工作卸载到后端数据库。我们仍然知道列模型中的列列表,但是我们要么为匹配该文本的单元格发送查询,要么为整个行发送单个查询。无论哪种方式,我们修改正在使用的分页加载配置对象,并为我们想要的数据发送新查询,并且执行过滤的实际工作是服务器的工作。从您的问题来看,这似乎是不您想要的,但没有更多细节,很难肯定。
答案 1 :(得分:0)
您可以通过过滤来实现这一目标。
最初,网格采用参数作为存储,对商店的修改将直接反映在用户界面上。
启用过滤:
store.setEnableFilters(true);
要过滤网格,请使用以下命令:
store.addFilter(new StoreFilter<M>()
{
@Override
public boolean select(...,...,...)
{
//return true if you want to display the row, else false
}
}