Share via


How To Move Items Up And Down In A ListView (Detail Mode)

Question

Monday, December 14, 2009 4:37 PM

I have a ListView in detail view mode and i want the user to be able to move the items up and down.

There are 5 columns per row.  How can I achieve this?

All replies (6)

Monday, December 14, 2009 4:50 PM ✅Answered | 1 vote

Hi

You can try this

http://www.knowdotnet.com/articles/listviewmoveitem.html

Its is vb.net. But the logic is the same.Please mark the response as answers if it solves your question or vote as helpful if you find it helpful. http://thoughtorientedarchitecture.blogspot.com/


Monday, December 14, 2009 6:49 PM ✅Answered | 5 votes

I have used this code in the past to move items up or down in the listview. Let me know if this helps any.

private void btnUp_Click(object sender, EventArgs e)
            {
                try
                {
                    if (lstResourcesSelected.SelectedItems.Count > 0)
                    {
                        ListViewItem selected = lstResourcesSelected.SelectedItems[0];
                        int indx = selected.Index;
                        int totl = lstResourcesSelected.Items.Count;

                        if (indx == 0)
                        {
                            lstResourcesSelected.Items.Remove(selected);
                            lstResourcesSelected.Items.Insert(totl - 1, selected);
                        }
                        else
                        {
                            lstResourcesSelected.Items.Remove(selected);
                            lstResourcesSelected.Items.Insert(indx - 1, selected);
                        }
                    }
                    else
                    {
                        MessageBox.Show("You can only move one item at a time. Please select only one item and try again.",
                            "Item Select", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
                catch (Exception ex)
                {
                   
                }
            }

            private void btnDown_Click(object sender, EventArgs e)
            {
                try
                {
                    if (lstResourcesSelected.SelectedItems.Count > 0)
                    {
                        ListViewItem selected = lstResourcesSelected.SelectedItems[0];
                        int indx = selected.Index;
                        int totl = lstResourcesSelected.Items.Count;

                        if (indx == totl - 1)
                        {
                            lstResourcesSelected.Items.Remove(selected);
                            lstResourcesSelected.Items.Insert(0, selected);
                        }
                        else
                        {
                            lstResourcesSelected.Items.Remove(selected);
                            lstResourcesSelected.Items.Insert(indx + 1, selected);
                        }
                    }
                    else
                    {
                        MessageBox.Show("You can only move one item at a time. Please select only one item and try again.",
                            "Item Select", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
                catch (Exception ex)
                {
                }
            }Dewayne Dodd - Landshark Software "Please make sure to 'Mark As Answer' if this answer solves your question"


Friday, September 2, 2011 8:41 PM

//Move items Down - just change insert index to move items up

if (this.listView.SelectedItems != null && this.listView.SelectedItems.Count > 0)
            {
                ListViewItem[] itemsTobemoved = this.listView.SelectedItems.Cast<ListViewItem>().ToArray<ListViewItem>();

                if (itemsTobemoved != null && itemsTobemoved.Length > 0)
                {
                    foreach (ListViewItem itm in itemsTobemoved)
                    {
                        this.listView.Items.Remove(itm);
                    }

                    foreach (ListViewItem itm in itemsTobemoved)
                    {
                        this.listView.Items.Insert(this.listView.Items.Count , itm);
                    }

                    Array.Clear(itemsTobemoved, 0, itemsTobemoved.Length);
                }
            }

Monday, May 5, 2014 5:54 AM

updated single selection item code with reselect..

private void upButton_Click(object sender, EventArgs e)
{
// shouldn't be possible for the button to still be enabled, but we'll check anyhow
if (secondariesList.SelectedIndex > 0)
{
int selectedIndex = secondariesList.SelectedIndex;
object selectedItem = secondariesList.Items[selectedIndex];
secondariesList.Items.RemoveAt(selectedIndex);
secondariesList.Items.Insert(selectedIndex - 1, selectedItem);
secondariesList.SelectedIndex = selectedIndex - 1;
}
}

private void downButton_Click(object sender, EventArgs e)
{
// shouldn't be possible for the button to still be enabled, but we'll check anyhow
if (secondariesList.SelectedIndex < secondariesList.Items.Count - 1)
{
int selectedIndex = secondariesList.SelectedIndex;
object selectedItem = secondariesList.Items[selectedIndex];
secondariesList.Items.RemoveAt(selectedIndex);
secondariesList.Items.Insert(selectedIndex + 1, selectedItem);
secondariesList.SelectedIndex = selectedIndex + 1;
}
}


Saturday, July 29, 2017 11:15 PM | 1 vote

Edit: Sorry, this is vb.net code...

I made two Subs that should do the job...

    Sub MoveListViewItemUp(ByVal _ListView As ListView)
        If Not _ListView.SelectedItems(0).Index = 0 Then
            Dim toMove As ListViewItem
            Dim oldIndex As Integer

            oldIndex = _ListView.SelectedItems(0).Index
            toMove = _ListView.SelectedItems(0)

            _ListView.Items.Remove(toMove)
            _ListView.Items.Insert(oldIndex - 1, toMove)
        End If
    End Sub
    Sub MoveListViewItemDown(ByVal _ListView As ListView)
        If Not _ListView.SelectedItems(0).Index + 1 = _ListView.Items.Count Then
            Dim toMove As ListViewItem
            Dim oldIndex As Integer

            oldIndex = _ListView.SelectedItems(0).Index
            toMove = _ListView.SelectedItems(0)

            _ListView.Items.Remove(toMove)
            _ListView.Items.Insert(oldIndex + 1, toMove)
        End If
    End Sub

Saturday, May 26, 2018 11:19 AM

It's a nice & good starting point, but the second sub is likely to crash as soon as one tries to move down a list item in a multiselect-enabled listview and one of the listitems reaches the boundary of the listview. Furthermore, in a multiselect-enabled listview, these two subs behave differently.

Here is my approach, based on yours:

Private Sub tsbMoveUp_Click(sender As System.Object, e As System.EventArgs) Handles tsbMoveUp.Click
    For Each li As ListViewItem In lvwFiles.Items
        If li.Selected = True Then
            Call moveListViewItemUp(lvwFiles, li.Index)
        End If
    Next
End Sub
 
Private Sub tsbMoveDown_Click(sender As System.Object, e As System.EventArgs) Handles tsbMoveDown.Click
    For currentIndex As Integer = lvwFiles.Items.Count - 1 To 0 Step -1
        Dim li As ListViewItem = lvwFiles.Items(currentIndex)
        If li.Selected = True Then
            Call moveListViewItemDown(lvwFiles, li.Index)
        End If
    Next
End Sub
 
Private Sub moveListViewItemUp(ByVal _ListView As ListView, ByVal selectedIndex As Integer)
    Try
        If Not _ListView.Items(selectedIndex).Index = 0 Then
            Dim toMove As ListViewItem
            Dim oldIndex As Integer
            oldIndex = _ListView.Items(selectedIndex).Index
            toMove = _ListView.Items(selectedIndex)
            _ListView.Items.Remove(toMove)
            _ListView.Items.Insert(oldIndex - 1, toMove)
        End If
    Catch ex As Exception
    End Try
End Sub
 
Private Sub moveListViewItemDown(ByVal _ListView As ListView, ByVal selectedIndex As Integer)
    Try
        If Not _ListView.Items(selectedIndex).Index + 1 = _ListView.Items.Count Then
            Dim toMove As ListViewItem
            Dim oldIndex As Integer
            oldIndex = _ListView.Items(selectedIndex).Index
            toMove = _ListView.Items(selectedIndex)
            _ListView.Items.Remove(toMove)
            _ListView.Items.Insert(oldIndex + 1, toMove)
        End If
    Catch ex As Exception
    End Try
End Sub