如何禁用网格中的元素

时间:2016-09-29 12:53:16

标签: javascript c# sql datagrid store

我有多个基于给定过滤器显示数据的网格(在使用REST Api的Web应用程序中)。显示的数据结构始终相同(以简化问题),但根据用户所在的屏幕,显示的结果会有所不同。

此外,这是问题,必须禁用某些结果,以便用户无法选择它们。

示例:Foo有N条。如果我想向父亲(foo)添加一个新的子(bar),我会进入搜索屏幕,但我希望过滤的网格显示为已经与父亲相关的残疾儿童。

目前,我通过执行细节连接来控制服务器(数据库查询)上的此问题,具体取决于方案和"禁用"结果我不想要。但是这种方法导致我无法重用查询(由于特定的连接。也许我需要搜索Bars int order将它们与其他父亲Baz联系起来,我想要禁用已经与当前父亲相关的条...)

另一种方法可能如下:

  • 将与父亲相关的子项(仅限ID)保存在内存(javascript)
  • 中的数组中
  • 在" prerender" grid事件(或类似)检查每个元素是否包含在前一个数组中(按id搜索)。如果是,请将其标记为已禁用(例如)。 这是客户端的可重用解决方案,我总是可以在服务器端重用相同的查询。

在开始实施此解决方案之前,我想知道是否有更好的选择。 我确定这是一个反复出现的问题,我不想重新发明轮子。

任何策略或建议?

编辑:show example:

假设这个模型:

Category N:M Item
SalesPromotion N:M Item

我有两个不同的屏幕:一个显示项目属于一个类别,另一个显示项目属于一个促销。在每个屏幕中,我都可以搜索项目并将它们添加到Category或SalesPromotion中。但是,当我搜索项目时,我希望已经属于Category / SalesPromotion的项目显示为已禁用(或者为了简单起见未在此示例中显示)。 我可以在服务器中执行此操作,执行以下查询:

-- Query for search Items in Category screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId

-- Query for search Items in SalesPromotion screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId

你可以想象如果我有越来越多这样的场景会发生什么(当然会有更复杂的模型和查询)。

一种替代方案可能是:

  • 将已属于当前Category / SalesPromotion的商品存储在内存中(javascript,clientside)。
  • 在客户端上的网格预渲染事件(或等效项)确定必须禁用哪些项目(通过搜索存储项目中的每一行)。

所以,我的问题是这种方法是一个很好的解决方案,还是有一个众所周知的解决方案(我认为是这样)。

2 个答案:

答案 0 :(得分:6)

我根据操作评论

更改了答案

所以你基本上有两个选择。

  1. 在查询数据库后删除Ids服务器端。 (影响响应性能但更安全)。
  2. 在客户端使用js执行此操作并将其从网格中删除。

答案 1 :(得分:3)

SELECT中,LEFT JOIN部分无用。您的WHERE子句仅使用ITEMS表,因此它对返回的行集没有影响,并且由于另一个表没有相应的行,因此该另一个表的列都是{{1 }}

您可以拥有一个NULL(+过滤器)并根据SELECT * FROM ITEMS iCategoryId等列调整您的用户界面PromotionId