繁体   English   中英

在.Net C#中拖放

[英]Drag and Drop in .Net c#

我已经实现了一个列表,我希望可以使用拖放来进行排序。

我已经使用ajaxToolkit ReorderList实现了列表。

它在用户界面上完美运行,这是我遇到的与将数据更新到数据库有关的问题。

我创建了一个按钮,该按钮允许用户保存更改(一次全部保存),问题是在单击事件中,如果我通过ReorderList循环通过,则项目将以原始顺序返回,而不是用户修改后的顺序。 似乎尽管列表已重新排序,但ReorderList仍保留原始数据源。

这是我的清单

<ajaxToolkit:ReorderList ID="rlVerticalMenu" runat="server" DragHandleAlignment="Left"
          ItemInsertLocation="Beginning" DataKeyField="Id" SortOrderField="Priority"
          EnableViewState="true" OnItemReorder="rlWorkItems_ItemReorder" 
          CallbackCssStyle="ClsCallBackStyle" CssClass="ClsReorderListContainer">          
        <ItemTemplate>                
            <div class="ClsItemArea">
               <div>                    
                    <asp:Label ID="LblId" runat="server" Visible="false" CssClass="editable_textarea" Text='<%# Eval("Id").ToString() %>' />
                    <div class="verticalMenuItem">
                        <asp:Label ID="LblDisplayName" runat="server" CssClass="editable_textarea" Text='<%# Eval("DisplayName").ToString() %>' />
                    </div>
                    <div class="verticalMenuItem">                        
                        <asp:Label ID="LblHref" runat="server" CssClass="editable_textarea" Text='<%# Eval("Href").ToString() %>'/>
                    </div>
                    <div class="verticalMenuItem">                        
                        <asp:Label ID="LblTooltip" runat="server" CssClass="editable_textarea" Text='<%# Eval("Tooltip").ToString() %>'/>
                    </div>
               </div>                                               
            </div>
        </ItemTemplate>
        <ReorderTemplate>
            <asp:Panel ID="Panel2" runat="server" CssClass="ClsReorderCue">
            </asp:Panel>
        </ReorderTemplate>
        <DragHandleTemplate>
            <div class="ClsDragHandle">
            </div>
        </DragHandleTemplate>
    </ajaxToolkit:ReorderList>                       
   <asp:Button ID="BtnGenerateMenu" runat="server" Text="Generate Menu" OnClick="BtnGenerateMenu_Click" />
</asp:Content>

任何想法我应该如何实现呢? 我该如何实施

protected void rlWorkItems_ItemReorder(object sender, ReorderListItemReorderEventArgs e)
        {


        }

方法?

谢谢

您是使用OrderBy (是LINQ表达式,以有序方式枚举列表)还是通过Sort (实际上改变列表的顺序)对列表进行重新Sort

您可以选择使用OrderBy遍历click事件中的列表,如下所示:

var qry = MyList.OrderBy(item => item.OrderingProperty)

这样,如果循环遍历qry ,将有一个列表,该列表由您在LINQ lambda表达式中指定的属性排序。

我设法实现了排序算法,但不确定是否有更好的方法可以执行此操作

protected void rlWorkItems_ItemReorder(object sender, ReorderListItemReorderEventArgs e)
    {

        List<VerticalMenuItem> list = (List<VerticalMenuItem>)Session["VerticalMenuItems"];
        List<VerticalMenuItem> newList = new List<VerticalMenuItem>();

        //if move one place - no matter top or bottom
        if (e.NewIndex - e.OldIndex == 1 || e.OldIndex - e.NewIndex == 1)
        {
            VerticalMenuItem oldItem = list[e.OldIndex];
            VerticalMenuItem newItem = list[e.NewIndex];
            list[e.NewIndex] = oldItem;
            list[e.OldIndex] = newItem;
            Session["VerticalMenuItems"] = list;
            return;
        }
        //From bottom to top
        if (e.OldIndex - e.NewIndex > 0)
        {
            VerticalMenuItem oldItem = list[e.OldIndex];                
            for (int i = 0; i < e.NewIndex; i++)
            {
                newList.Add(list[i]);
            }
            list.Remove(oldItem);
            newList.Add(oldItem);
            for (int i = e.NewIndex; i < list.Count; i++)
            {
                newList.Add(list[i]);
            }
            Session["VerticalMenuItems"] = newList;
            return;
        }
        //From top to bottom
        if (e.OldIndex - e.NewIndex < 0)
        {
            VerticalMenuItem oldItem = list[e.OldIndex];
            list.Remove(oldItem);
            for (int i = 0; i < e.NewIndex; i++)
            {
                newList.Add(list[i]);
            }                
            newList.Add(oldItem);
            for (int i = e.NewIndex; i < list.Count; i++)
            {
                newList.Add(list[i]);
            }
            Session["VerticalMenuItems"] = newList;
        }        
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM