Пустая ListViewGroup не отображается в ListView - PullRequest
9 голосов
/ 05 марта 2012

Я не смог найти никаких замечаний по MSDN Свойство ListView.Groups , что пустой список ListViewGroup будет скрыт. Это по дизайну, или я что-то упустил? В моем примере кода ниже будет отображаться только «группа 2» с элементом «item1».

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
      Handles MyBase.Load
    '
    Dim gr = New ListViewGroup("group 1")
    ListView1.Groups.Add(gr)
    '
    Dim gr2 = New ListViewGroup("group 2")
    ListView1.Groups.Add(gr2)
    '
    Dim lvi As New ListViewItem("item1")
    ListView1.Items.Add(lvi)
    '
    gr2.Items.Add(lvi)
End Sub

Обновлено: Есть ли способ показать ListViewGroup без добавления фиктивного элемента

На данный момент единственная обходная идея, которую я имею, состоит в том, чтобы использовать разборный просмотр списка (Vista и выше)

Ответы [ 5 ]

5 голосов
/ 24 марта 2012

Лучше ListView может сделать именно это.Существует свойство ShowEmptyGroups , которое делает свое дело:

empty group in Better ListView

Существует также Better ListView Express , который является бесплатным и поддерживаетгруппы также.Это не оболочка ListView, а полная реализация всех функций, на 100% управляемых и просто сделанных ... лучше: -)

4 голосов
/ 08 марта 2012

Невозможно по дизайну Microsoft.
Посмотрите на это обсуждение на social.msdn.microsoft.com .
Не обманывайте себя по названию. Это говорит о пустых группах.

3 голосов
/ 10 мая 2012

этот метод гарантирует, что ListViewGroup показывает

void MakeSureListViewGroupHeaderShows(ListView lv)
{
    foreach (ListViewGroup lvg in lv.Groups)
    {
        if (lvg.Items.Count == 0)
        {
            // add empty list view item
            ListViewItem lvi = new ListViewItem(string.Empty);
            lvi.Group = lvg;
            lv.Items.Add(lvi);
        }
        else
        {
            // remove our dummy list view item
            foreach (ListViewItem lvi in lvg.Items)
            {
                if (lvi.Text == string.Empty)
                {
                    lvi.Remove();
                }
            }
        }
    }
}
1 голос
/ 13 марта 2012

Взлом, о котором я говорю выше, НЕ РЕКОМЕНДУЕТСЯ. Однако, если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы отображались пустые группы, то вам просто нужно делегировать код добавления отдельному служебному методу, который проверяет, является ли группа пустой. Если это так, то он добавляет его в группу «по умолчанию» (так, по крайней мере, он появляется), пока вы не добавите в него элемент.

public static void AddGroup(this ListView lv, ListViewGroup lg)
{
    if (lg.Items.Count > 0 || lv.Items.Cast<ListViewItem>().Any(tg => tg.Group == lg))
        lv.Groups.Add(lg);
    else
    {
        var item = lv.Items.Add(lg.Header);
        item.Tag = lg;
    }
}

public static void AddItem(this ListView lv, ListViewItem li, string groupKey) // Could also take ListViewGroup here...
{
    if (lv.Groups[groupKey] == null && lv.Items.ContainsKey(groupKey))
    {
        lv.Groups.Add((ListViewGroup)lv.Items[groupKey].Tag);
        lv.Items.RemoveByKey(groupKey);
    }
    lv.Items.Add(li);
    li.Group = lv.Groups[groupKey];
}

public static void AddItem(this ListView lv, ListViewItem li, ListViewGroup lg)
{
    lv.AddItem(li, lg.Header);
}

Еще одно предупреждение, НЕ РЕКОМЕНДУЕТСЯ. Это довольно много накладных расходов, и на самом деле не стоит проблем (IMO). Но эй, каждому свое. Этот код полностью не проверен, и просто выдает его на тот случай, если вам действительно нужно, чтобы это работало (чего никогда не должно быть, лучше искать альтернативы). Хуже всего то, что объявление Group в основном находится внутри самого ListItem, так что вы можете легко изменить группу.

Последнее предупреждение, НЕ РЕКОМЕНДУЕТСЯ.

Edit: я изменил код выше, чтобы быть методами расширения объектов ListView, таким образом, у вас есть прямой доступ к ListView из методов. Каждый раз, когда вы добавляете группу, вы просто вызываете listView.AddGroup, добавляя элемент, который вы можете использовать из методов listView.AddItem. Это противоположно listView.Items.Add и listView.Groups.Add методам. Следует помнить одну вещь: вам не нужно назначать элементы группам, а вместо этого назначать группы только элементам. Это позволяет переключать элементы между группами, изменяя ссылку, вместо того, чтобы удалять / добавлять ссылки между группами. Это также предполагает, что вы объявили Header ListItemGroup такой же, как Key (другими словами, new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/). В противном случае вам просто нужно изменить логику в AddItem для ссылки правильное значение (обычно Name).

0 голосов
/ 13 марта 2012

"Я столкнулся с той же проблемой ранее в этом году при рассмотрении вопроса об отображении пустых групп. Microsoft, собственно говоря, не отображает имя группы, которое не содержит каких-либо элементов. Что вам нужно сделать, это создать / добавить пустой элемент или элемент, содержащий пустой символ текста для группы. Если у вас есть фактические элементы данных для заполнения для этой группы, вы должны не забыть удалить пустой / пустой элемент из этой группы. "

Источник: http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/39681a70-d992-4046-ad7e-21a2e33791b1

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