Вставка элемента в вид списка C # Winforms - PullRequest
1 голос
/ 27 октября 2011

Следующая строка вызывает у меня серьезную головную боль:

listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));

Все, что я хочу сделать, это вставить элемент в представление списка. Список находится в подробном режиме с включенными группами. Вставленный элемент должен войти в первую группу с индексом 0. Но происходит то, что элемент всегда добавляется как последний элемент в группе. Как будто первый параметр Insert (...) не имел никакого эффекта ...

Что-нибудь, что мне здесь не хватает?

Кстати: сортировка отключена при просмотре списка!

Ответы [ 3 ]

6 голосов
/ 27 октября 2011

Вы можете попробовать:

ListViewItem item = new ListViewItem("Test");
this.listView1.Items.Insert(0, item);
this.listView1.Groups[0].Items.Insert(0, item);

Подробное обсуждение можно найти здесь .

В этом примере три группы добавляются в представление списка и добавляются элементы в первую очередьположение групп:

for (int groupIndex = 0; groupIndex < 3; ++groupIndex) {
   this.listView1.Groups.Add("GroupKey" + groupIndex, "Test" + groupIndex);

   for (int index = 0; index < 5; ++index) {
      ListViewItem item = new ListViewItem("Test " + groupIndex + "/" + index,
                                           this.listView1.Groups[groupIndex]);
      this.listView1.Items.Insert(0, item);
      this.listView1.Groups[groupIndex].Items.Insert(0, item);
    }
 }

 for (int groupIndex = 2; groupIndex >= 0; --groupIndex) {
    for (int index = 0; index < 5; ++index) {
      ListViewItem item = new ListViewItem("Test2 " + groupIndex + "/" + index,
                                           this.listView1.Groups[groupIndex]);
      this.listView1.Items.Insert(0, item);
      this.listView1.Groups[groupIndex].Items.Insert(0, item);
   }
 }

Это результат: enter image description here

2 голосов
/ 03 января 2015

Какой-то тип волшебства,

, если вы добавляете элемент в представление списка и назначаете для него группу G. элемент будет отображаться не на своем месте.

Теперь, есливы получаете группу, содержащую элемент (G), меняете ее имя на какое-то временное значение, затем меняете обратно на оригинальное имя, все будет отображаться ОК.

Поэтому вместо

listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));

делать

Dim LVI as new ListViewItem("Test")
listView1.Items.Insert(0, LVI)
LVI.Group = listView1.Groups[0]

Dim TempStr as string = LVI.Group.Header
LVI.Group.Header = "whatever"
LVI.Group.Header = TempStr
1 голос
/ 29 мая 2015

У меня тоже была эта проблема. Я не использую какие-либо группы или сортировку. Тем не менее, если я пытаюсь вставить любой индекс, он всегда отображается LAST. Мне пришлось создать «сортировщик», который заставляет представление списка всегда использовать тот же порядок, что и для коллекции Items.

class CompareByIndex : IComparer
{
    private readonly ListView _listView;

    public CompareByIndex(ListView listView)
    {
        this._listView = listView;
    }
    public int Compare(object x, object y)
    {
        int i = this._listView.Items.IndexOf((ListViewItem)x);
        int j = this._listView.Items.IndexOf((ListViewItem)y);
        return i - j;
    }
}

и использовать его

   this.listView1.ListViewItemSorter = new CompareByIndex(this.listView1);

Я бы хотел использовать лямбда-выражение вместо вспомогательного класса. Но я не могу понять, как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...