как изменить индекс элемента в списке?

У меня есть listView и две кнопки (UP, DOWN), и я хочу переместить выбранный элемент вверх или вниз.
Я думал о переключении между выбранным элементом и верхним.. но код, который я пробовал.. не имеет смысла, потому что индекс доступен только для чтения.
также мины или сумма не работают.. я не могу возиться с индексом вообще.

private void btnDown_Click(object sender, EventArgs e)
    {
         listView1.SelectedItems[0].Index--; // It's ReadOnly.
    }


Итак... как я могу предоставить пользователю возможность изменять индекс ListViewItem, например, как VB позволяет нам изменять этот индекс элемента [как на картинке]

введите здесь описание изображения

заранее спасибо ...


person Murhaf Sousli    schedule 12.03.2012    source источник
comment
вы должны изменить порядок в источнике для списка   -  person Random Dev    schedule 12.03.2012
comment
@CarstenKönig Не могли бы вы объяснить подробнее .. какой порядок в каком источнике .. я имею в виду, что небольшой код может помочь.   -  person Murhaf Sousli    schedule 12.03.2012
comment
лол-код? как мне создать код, не увидев сначала ничего полезного из вашего кода? - Вы заполняете источник списка датой - я не понимаю, как это сделать, но вы должны сделать это - и именно в этих данных вы должны изменить порядок элементов, которые вы хотите переключить   -  person Random Dev    schedule 12.03.2012
comment
@CarstenKönig, как только что сделал M4N.   -  person Murhaf Sousli    schedule 12.03.2012
comment
хорошо, но что вы получаете от этого? Конечно, пользователь увидит измененный порядок, но сохранятся ли эти данные? Я имею в виду, что есть причина, по которой ваш пользователь может захотеть изменить порядок, верно? То, что дал M4N, - это взлом пользовательского интерфейса - AKA sphagetti-code - не очень хороший шаблон, но продолжайте ...   -  person Random Dev    schedule 12.03.2012
comment
@CarstenKönig Это приложение для передачи файлов ... все, что я хотел сделать, это позволить пользователю сортировать элементы, которые он добавляет (из другого списка) ... потому что порядок важен для передачи файлов ... метод отправки зависит от этого индекса.   -  person Murhaf Sousli    schedule 12.03.2012
comment
так вы берете данные о пользователях из формы-контроля? ... Что ж, надеюсь, это небольшое приложение - но вы получили ответ, и это все, что здесь имеет значение - для обсуждения того, почему это может быть не такой уж хорошей идеей в реальном / среднем или большом проекте, спросите в Программисты   -  person Random Dev    schedule 12.03.2012
comment
@CarstenKönig взгляните, это мое приложение. -in-another-li" title="как проверить, существует ли текст подэлементов имени элемента в другом li"> stackoverflow.com/questions/9663528/   -  person Murhaf Sousli    schedule 12.03.2012


Ответы (3)


Вы должны сначала удалить выбранный элемент, а затем повторно добавьте его в новую позицию.

Например, чтобы переместить элемент вверх на одну позицию:

var currentIndex = listView1.SelectedItems[0].Index;
var item = listView1.Items[index];
if (currentIndex > 0)
{
    listView1.Items.RemoveAt(currentIndex);
    listView1.Items.Insert(currentIndex-1, item);
}
person M4N    schedule 12.03.2012

Ниже приведено улучшение ответа M4N для обработки повторного порядка элемента в верхней части списка и его размещения в нижней части списка.

int currentIndex = listView1.SelectedItems[0].Index;
ListViewItem item = listView1.Items[currentIndex];
if (currentIndex > 0)
{
    listView1.Items.RemoveAt(currentIndex);
    listView1.Items.Insert(currentIndex - 1, item);
}
else
{
    /*If the item is the top item make it the last*/
    listView1.Items.RemoveAt(currentIndex);
    listView1.Items.Insert(listView1.Items.Count, item);
}
person al000y    schedule 22.02.2016

В случае наблюдаемых коллекций вы также можете вызвать: .Move(currentindex, newindex);

MSDN

person ISAF    schedule 11.07.2016