0

假设我有一个订单和订单详情。
该视图将包含订单字段和 Telerik Grid 的详细信息,
我始终在会话中维护订单的参考。

Session["Order"] = order;

当用户向网格添加订单详细信息时,我将其保存在订单参考中。

public ActionResult Grid_AddDetail(OrderDetail orderDetail)  {
(Session["order"] as Order).Details.Add(orderDetail);    
}  

问题是当我需要更新行时,如何确定订单详细信息中的哪些详细信息已更新?

public ActionResult Grid_UpdateDetail(OrderDetail orderDetail)  {
///how will i compare the element in the details, with the orderDetail?        
(Session["order"] as Order).Details.IndexOf(orderDetail) = orderDetail;
}  

该问题可以通过添加序列号列来解决,并将传入的详细信息与我参考中存在的进行比较,方法是覆盖 Equal:

public overrid Equal(object obj){
return (obj as OrderDetail).Serial == this.Serial;
}

但我希望序列号列不可见,但如果我这样做,它将不会显示在传入的详细信息中。

4

2 回答 2

0

我所做的是:
添加了一个名为 Serial
的列,使列宽设置为 0。

columns.Bound(m => m.Serial).Title("").Sortable(false).Width(0);

它将在(插入,更新)中呈现,但删除的问题是使他(如布雷特所说)成为数据键。

public ActionResult Grid_AddDetail(OrderDetail orderDetail)  {
  if ((Session["order"] as Order).Details.Count != 0)
     item.Serial= (Session["order"] as Order).Details.Max(d => d.Serial) + 1;
  (Session["order"] as Order).Details.Add(orderDetail);    
 } 

public ActionResult Grid_UpdateDetail(OrderDetail orderDetail)  {
///order detail now contains the serial number.  
(Session["order"] as Order).Details.IndexOf(orderDetail) = orderDetail;
} 
于 2010-09-02T13:14:02.773 回答
0

如果您只想使该列不可见,我认为这应该会有所帮助:

AutoGenerateColumns="false"

这将迫使您生成显示信息的列,而不是 gridview 自动为您创建它们。所以现在你需要做这样的事情来让订单显示

<asp:TemplateField>
      <ItemTemplate>
           <b><%# DataBinder.Eval(Container.DataItem, "Order") %>:</b>
      </ItemTemplate>
</asp:TemplateField>

编辑:

要在不可见时访问序列号,您需要使用 DataKeys:

orderDetail.DataKeyNames = new string[] { "Serial" };
于 2010-09-01T13:39:39.993 回答