对于C#列表,当一条记录';s值变化?

对于C#列表,当一条记录';s值变化?,c#,list,recursion,collections,kendo-grid,C#,List,Recursion,Collections,Kendo Grid,我有一个剑道网格,用户可以通过上下移动行来更改行的顺序。我通过递增或递减1来调整order字段。我现在需要对网格中的其余项目重新排序。将数据传递回控制器,我现在正尝试对列表重新排序。我觉得我很接近,但不能完全正确。有人能帮我弄清楚怎么做吗 例如: 从这个网格开始 Test | Order A | 1 B | 2 C | 3 D | 4 用户单击B行和向上箭头,因此网格现在如下所示: Test | Order B | 1 A | 1 C | 3 D

我有一个剑道网格,用户可以通过上下移动行来更改行的顺序。我通过递增或递减1来调整order字段。我现在需要对网格中的其余项目重新排序。将数据传递回控制器,我现在正尝试对列表重新排序。我觉得我很接近,但不能完全正确。有人能帮我弄清楚怎么做吗

例如:

从这个网格开始

Test | Order
  A  | 1
  B  | 2
  C  | 3
  D  | 4
用户单击B行和向上箭头,因此网格现在如下所示:

Test | Order
  B  | 1
  A  | 1
  C  | 3
  D  | 4
[0] Test: B, Order: 1
[1] Test: A, Order: 1
[2] Test: C, Order: 3
[3] Test: D, Order: 4
[0] Test: B, Order: 1
[1] Test: A, Order: 2
[2] Test: C, Order: 3
[3] Test: D, Order: 4
这部分工作正常,所以我认为不需要任何代码。这是我需要帮助的地方。因此,我来到控制器,我有一个如下列表:

Test | Order
  B  | 1
  A  | 1
  C  | 3
  D  | 4
[0] Test: B, Order: 1
[1] Test: A, Order: 1
[2] Test: C, Order: 3
[3] Test: D, Order: 4
[0] Test: B, Order: 1
[1] Test: A, Order: 2
[2] Test: C, Order: 3
[3] Test: D, Order: 4
有两条记录的顺序等于1。如何对列表重新排序(以便将新的顺序保存到数据库中)

我想要的是一个如下所示的列表:

Test | Order
  B  | 1
  A  | 1
  C  | 3
  D  | 4
[0] Test: B, Order: 1
[1] Test: A, Order: 1
[2] Test: C, Order: 3
[3] Test: D, Order: 4
[0] Test: B, Order: 1
[1] Test: A, Order: 2
[2] Test: C, Order: 3
[3] Test: D, Order: 4
我提出了这个解决方案,但是递归部分工作不正常。我返回的列表是空的。有人能找到问题吗

    [HttpPost]
    public ActionResult UpdateComments([DataSourceRequest] DataSourceRequest request, ModelComment model)
    {
        List<ModelComment> comments = new List<ModelComment>();

        comments.Add(model);

        List<ModelComment> otherComments = data.GetCommentsByAnalysisID(model.analysisID);

        List<ModelComment> changedComments = ChangeDuplicateOrders(otherComments, model.commentsSelectedID, model.order);

        return Json(comments.ToDataSourceResult(request));
    }

    private List<ModelComment> ChangeDuplicateOrders(List<ModelComment> comments, int ID, int order)
    {
        List<ModelComment> changedComments = new List<ModelComment>();

        foreach (ModelComment comment in comments)
        {
            if (comment.commentsSelectedID != ID)
            {
                ModelComment changedComment = comment;

                if (comment.order == order)
                {
                    changedComment.order = order + 1;
                    changedComments.Add(changedComment);
                }

                List<ModelComment> remainingComments = new List<ModelComment>();
                remainingComments = comments;
                remainingComments.Remove(changedComment);

                List<ModelComment> processedcomments = ChangeDuplicateOrders(remainingComments, changedComment.commentsSelectedID, changedComment.order);
                changedComments = (changedComments.Concat(processedcomments)).ToList();
            }
        }

        return changedComments;
    }
[HttpPost]
公共操作结果更新注释([DataSourceRequest]DataSourceRequest请求,ModelComment模型)
{
列表注释=新列表();
注释。添加(模型);
列出otherComments=data.getCommentsByAnalysId(model.analysisID);
List changedComments=ChangeDuplicateOrders(其他注释,model.comments Selected,model.order);
返回Json(comments.ToDataSourceResult(request));
}
私有列表更改重复顺序(列表注释、整数ID、整数顺序)
{
List changedComments=新列表();
foreach(注释中的ModelComment注释)
{
if(comment.commentsSelectedID!=ID)
{
ModelComment changedComment=注释;
if(comment.order==order)
{
changedComment.order=订单+1;
changedComments.Add(changedComments);
}
List remainingComments=新列表();
剩余评论=评论;
remainingComments.Remove(changedcomments);
List processedcomments=ChangeDuplicateOrders(remainingComments,ChangedComments.Comments Selected,ChangedComments.order);
changedComments=(changedComments.Concat(processedcomments)).ToList();
}
}
返回更改的注释;
}
编辑: 以下是视图,您可以看到我在客户端执行的操作:

@using (Html.BeginForm("LabApprovals_History", "Home"))
{
<div class="breadcrumb">
    @Html.Raw(@ClsUtility.GetCurrentCrumb("Lab Approvals Comments"))
</div>
if (@ViewBag.Message != null && @ViewBag.Message != "")
{
    <div id="divErrorMessage" style="color: #1A78C2;">
        <br />
        @Html.Raw(@ViewBag.Message)
    </div>
    <br />
    <div style="clear: both">
        <br />
    </div>
}
<br />
<div style="text-align: center; padding-left: 10px;">
    <div id="grid"></div>
    @(Html.Kendo().Grid<DALubeBarcode.Models.ModelComment>().Name("gridComments")
                            .DataSource(dataSource => dataSource
                                .Ajax()
                                .Read(read => read.Action("ReadComments", "Home", new { analysisID = Model.analysisID }))
                                .Update(update => update.Action("UpdateComments", "Home"))
                                .Model(model => model.Id(p => p.commentsSelectedID))
                            )
                            .ToolBar(toolbar => toolbar.Save())
                            .Columns(columns =>
                            {
                                columns.Bound(m => m.commentsSelectedID).Visible(false);
                                columns.Bound(m => m.commentText).Title("Comment").Width("500px");
                                columns.Bound(m => m.order)
                                    .ClientTemplate("<input type='button' class='k-button' onclick=up(\'#=uid#\') value='up' />").Title("");
                                columns.Bound(m => m.order)
                                    .ClientTemplate("<input type='button' class='k-button' onclick=down(\'#=uid#\') value='down' />").Title("");
                                columns.Bound(m => m.order).Title("Order").Width("50px");
                            })
                        .Sortable()
                        .HtmlAttributes(new { style = "height:600px;" })
                        .Resizable(resize => resize.Columns(true))
                        .Editable(editable => editable.Mode(GridEditMode.InCell))
)
</div>

}

<script>
function up(uid) {
    var grid = $("#gridComments").data("kendoGrid");
    var dataItem = grid.dataSource.getByUid(uid);
    dataItem.order = dataItem.order - 1;

    var index = grid.dataSource.indexOf(dataItem);
    var newIndex = Math.max(0, index - 1);

    if (newIndex != index) {
        grid.dataSource.remove(dataItem);
        grid.dataSource.insert(newIndex, dataItem);
    }

    var dataSource = $("#gridComments").data("kendoGrid").dataSource;
    dataSource.data()[newIndex].dirty = true;
    dataSource.sync();

    return false;
}

function down(uid) {
    var grid = $("#gridComments").data("kendoGrid");
    var dataItem = grid.dataSource.getByUid(uid);
    dataItem.order = dataItem.order + 1;

    var index = grid.dataSource.indexOf(dataItem);
    var newIndex = Math.min(grid.dataSource.total() - 1, index + 1);

    if (newIndex != index) {
        grid.dataSource.remove(dataItem);
        grid.dataSource.insert(newIndex, dataItem);
    }

    var dataSource = $("#gridComments").data("kendoGrid").dataSource;
    dataSource.data()[newIndex].dirty = true;
    dataSource.sync();

    return false;
}
@使用(Html.BeginForm(“labu历史”、“主页”))
{
@Html.Raw(@clsutibility.getcurrentcrump(“实验室批准评论”))
如果(@ViewBag.Message!=null&&@ViewBag.Message!=“”)
{

@Html.Raw(@ViewBag.Message)

}
@(Html.Kendo().Grid().Name(“gridComments”) .DataSource(DataSource=>DataSource .Ajax() .Read(Read=>Read.Action(“ReadComments”,“Home”,new{analysisID=Model.analysisID})) .Update(Update=>Update.Action(“UpdateComments”、“Home”)) .Model(Model=>Model.Id(p=>p.commentsSelectedID)) ) .ToolBar(ToolBar=>ToolBar.Save()) .列(列=> { columns.Bound(m=>m.commentsSelectedID).Visible(false); columns.Bound(m=>m.commentText).Title(“Comment”).Width(“500px”); columns.Bound(m=>m.order) .ClientTemplate(“”)。标题(“”); columns.Bound(m=>m.order) .ClientTemplate(“”)。标题(“”); 列.绑定(m=>m.order).标题(“订单”).宽度(“50px”); }) .Sortable() .HtmlAttributes(新的{style=“height:600px;”}) .resize可调整大小(resize=>resize.Columns(true)) .Editable(Editable=>Editable.Mode(GridEditMode.InCell)) ) } 功能启动(uid){ var grid=$(“#gridComments”).data(“kendoGrid”); var dataItem=grid.dataSource.getByUid(uid); dataItem.order=dataItem.order-1; var index=grid.dataSource.indexOf(数据项); var newIndex=Math.max(0,索引-1); if(newIndex!=索引){ grid.dataSource.remove(dataItem); grid.dataSource.insert(newIndex,dataItem); } var dataSource=$(“#gridComments”).data(“kendoGrid”).dataSource; dataSource.data()[newIndex].dirty=true; dataSource.sync(); 返回false; } 函数关闭(uid){ var grid=$(“#gridComments”).data(“kendoGrid”); var dataItem=grid.dataSource.getByUid(uid); dataItem.order=dataItem.order+1; var index=grid.dataSource.indexOf(数据项); var newIndex=Math.min(grid.dataSource.total()-1,index+1); if(newIndex!=索引){ grid.dataSource.remove(dataItem); grid.dataSource.insert(newIndex,dataItem); } var dataSource=$(“#gridComments”).data(“kendoGrid”).dataSource; dataSource.data()[newIndex].dirty=true; dataSource.sync(); 返回false; }

类似这样的方法会奏效,但我没有时间检查语法,所以请注意大写之类的:

 private void reorder (myList, oldIndex, newIndex) {
     ModelComment itemToMove = myList.First(x=>x.order==oldIndex);
     ModelComment insertPoint = myList.First(x=>x.order==newIndex);
     myList.Remove(itemToMove);
     if (newIndex < oldIndex) {
         myList.select(x=>x.order>=newIndex && x.order<oldIndex).foreach(x=>x.order++);
     } else {
         myList.select(x=>x.order<=newIndex && x.order>oldIndex).foreach(x=>x.order--);
     }
     itemToMove.order = newIndex;
     myList.Insert(myList.IndexOf(insertPoint), itemToMove);
 } 
private void重新排序(myList、oldIndex、newIndex){
modelcoment itemToMove=myList.First(x=>x.order==oldIndex);
modelcoment insertPoint=myList.First(x=>x.order==newIndex);
myList.Remove(itemToMove);
如果(新索引<旧索引){
选择(x=>x.order>=newIndex&&x.orderx.order++);
}否则{
myList.select(x=>x.orderoldIndex).foreach(x=>x