我们可以从数据库表开始。它可能看起来像
CREATE TABLE dbo.OrderStatus (
Id int IDENTITY NOT NULL,
Name nvarchar(100) NOT NULL,
CONSTRAINT PK_LT_OrderStatus PRIMARY KEY CLUSTERED (Id),
CONSTRAINT UC_LT_OrderStatus_Name UNIQUE NONCLUSTERED (Name)
)
它允许通过Id 或Name 处理此类OrderStatus 表的任何项目。 UNIQUE CONSTRAINT 不允许添加重复名称。另一个表Order可以有列
CREATE TABLE dbo.Order (
Id int IDENTITY NOT NULL,
OrderStatusId int NOT NULL,
...
)
ALTER TABLE dbo.Order WITH CHECK ADD CONSTRAINT FK_Order_OrderStatus
FOREIGN KEY(OrderStatusId) REFERENCES dbo.OrderStatus (Id)
在用数据填充网格时,您有两个主要选择:在数据中使用 OrderStatusId 或使用来自dbo.OrderStatus 的相应Name:
SELECT Id,OrderStatusId, ... FROM dbo.Order
或
SELECT Id,os.Name AS OrderStatus, ...
FROM dbo.Order AS o
INNER JOIN dbo.OrderStatus AS os ON os.Id=o.OrderStatusId
如果您决定使用 id(OrderStatusId 值)填充网格,则必须使用 formatter: "select" 在相应列中显示文本(请参阅here)。它要求您必须让editoptions.value 填充来自dbo.OrderStatus 的所有不同值。实现这一点的最佳方法是扩展来自服务器的响应以使用您的自定义数据填充网格并使用beforeProcessing 设置editoptions.value。我在the answer 中描述了这个场景。我会在下面提醒你。
让我们从服务器的响应看起来像
{
"rows": [{...}, {...}]
}
如果返回的数据看起来像
[{...}, {...}]
那么你应该包括包装。我建议你做
SELECT Id,Name FROM dbo.OrderStatus
另外从dbo.Order (SELECT * FROM dbo.Order) 中进行主要选择,然后将 both 结果放在服务器响应中:
{
"orderStatus": [{"id":1, "name":"Pending"}, ...],
"rows": [{...}, {...}]
}
要处理orderStatus,您需要添加以下beforeProcessing,即orderStatus 并设置网格orderStatus 列的editoptions.value:
beforeProcessing: function (response) {
var $self = $(this), orderStatus = response.orderStatus, i, values = "";
if (orderStatus != null && orderStatus.length > 0) {
for (i = 0; i < orderStatus.length; i++) {
if (values.length > 0) {
values += ";";
}
values += orderStatus[i].id + ":" + orderStatus[i].name;
}
$self.jqGrid("setColProp", "orderStatus", {
editoptions {
value: values
}
});
if (this.ftoolbar) { // filter toolbar exist
$self.jqGrid("destroyFilterToolbar");
$self.jqGrid("filterToolbar");
}
}
}
上面的代码没有经过测试,但希望从中能清楚大意。