0

我正在尝试在我的 radgrid 上使用拖动重新排序。我的代码对我来说效果很好(它在 RowDrop 事件上触发),但我的客户无法让它工作,我已经对其进行了故障排除,以表明当他进行放置时,args 的 DestDataItem 属性为空,所以丢弃逻辑永远不会触发?!?这是我的代码:

protected void questionGrid_RowDrop(object sender, GridDragDropEventArgs e)
    {
        if (e.DestDataItem != null)
        {
            int tempId = int.Parse(editingId.Value);
            theTemplate = ent.SurveyTemplates.Where(i => i.Id == tempId).FirstOrDefault();
            int id = int.Parse(e.DraggedItems[0]["Id"].Text);
            SurveyQuestion draggedQuestion = ent.SurveyQuestions.Where(i => i.Id == id).FirstOrDefault();
            List<SurveyQuestion> tempArray = theTemplate.Questions.OrderBy(i => i.Rank).ToList();
            tempArray.Remove(draggedQuestion);
            tempArray.Insert(e.DestDataItem.ItemIndex, draggedQuestion);
            int j = 0;
            foreach (SurveyQuestion sq in tempArray)
            {
                sq.Rank = j;
                j++;
            }
            ent.SaveChanges();
            questionGrid.Rebind();
        }
        else
        {
            Exceptions.LogException(new Exception("NULL DEST"));
        }
    }

它只是引用拖动的项目并将其从项目列表中拉出并将其重新插入到新索引处,然后将每个项目的 rank 属性更新为其新索引并保存。

为什么这对我有用而不对他有用?这个服务器端代码会受到浏览器差异的困扰吗?

4

1 回答 1

1

正如在这个线程中提到的,如果项目没有放在网格中的实际数据行上,则 DestDataItem 将为空。

如果目标不是数据行,您可以通过在客户端处理 OnRowDropping 事件并忽略您不想要的东西来防止触发您的 RowDrop 事件:

function gridRowDropping(sender, args)
{
    if (!args.get_targetGridDataItem())
        args.set_cancel(true);
}
于 2013-04-23T17:47:30.567 回答