2010-08-05 7 views
1

J'ai mis en place une liste que je veux pouvoir commander en utilisant le glisser-déposer.Glisser-déposer .Net C#

J'ai implémenté la liste en utilisant ajaxToolkit ReorderList.

Cela fonctionne parfaitement sur l'interface utilisateur le problème que j'ai est lié à la mise à jour des données dans la base de données.

J'ai créé un bouton qui permet à l'utilisateur d'enregistrer les changements (tout à la fois), le problème est que dans l'événement click si je boucle la ReorderList les articles sont retournés dans l'ordre original, pas celui l'utilisateur l'a modifié. On dirait que malgré que la liste soit réorganisée, ReorderList conserve la source de données originale.

ceci est ma liste

<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> 

Toute idée comment je devrais mettre en œuvre ce? Comment implémenter le

protected void rlWorkItems_ItemReorder(object sender, ReorderListItemReorderEventArgs e) 
     { 


     } 

méthode?

Merci

Répondre

0

j'ai réussi à mettre en œuvre un algorithme de tri, je ne sais pas s'il y a une meilleure façon de le faire, mais il fonctionne

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; 
     }   
    } 
0

Vous ReOrdering la liste à l'aide OrderBy, qui est une expression LINQ qui énumère la liste de façon ordonnée, ou par Sort, ce qui change réellement l'ordre de la liste?

Vous pouvez choisir de parcourir la liste en cas de clic en utilisant OrderBy comme ceci:

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

De cette façon, si vous boucle à travers qry, vous aurez une liste ordonnée par la propriété que vous avez spécifié dans votre expression LINQ lambda.