2012-03-05 15 views
9

Non ho trovato alcun commento su MSDN ListView.Groups Property che ListViewGroup vuoto verrà nascosto. È di progettazione o mi manca qualcosa? Il mio codice di esempio qui sotto mostrerà solo "gruppo 2" con oggetto "elemento1".Empty ListViewGroup non è mostrato in ListView

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 

Aggiornato: è che ci sono un modo per mostrare ListViewGroup senza l'aggiunta di voce fittizia

Per ora l'unica idea soluzione che ho è di usare collapsible listview (Vista e su)

+0

Per quanto riguarda lo so, i gruppi vuoti semplicemente non vengono visualizzati. È possibile aggiungere una stringa vuota solo per visualizzare il gruppo. – nik

+0

Penso che tu abbia ottenuto la risposta –

+0

corretta. I gruppi vuoti non vengono visualizzati. Devi prima aggiungere elementi a loro. –

risposta

3

non è possibile dal design di Microsoft.
Guarda questa discussione su social.msdn.microsoft.com.
Non fatevi ingannare dal titolo. Parla di gruppi vuoti.

+0

Questo è corretto. Guardando il codice sorgente per ListView, tutta la pittura e il raggruppamento viene fatto tramite PInvokes, il che significa che non si tratta semplicemente di ignorare il metodo di disegno di ListView. Potrebbe esserci un modo per farlo attraverso l'uso di un piccolo "hack" che pubblicherò, ma non è carino. – SPFiredrake

+1

In questo caso supporto la decisione di progettazione Microsoft. Non mi piace aprire un gruppo e non trovare nulla dentro. Meglio non mostrare nulla. – Steve

1

L'hack di cui sto parlando in alto NON E 'RACCOMANDATO. Tuttavia, se VERAMENTE desideri visualizzare i gruppi vuoti, devi semplicemente delegare il codice di aggiunta a un metodo di utilità separato che controlla se il gruppo è vuoto. Se lo è, quindi lo aggiunge al gruppo "predefinito" (quindi almeno si presenta) finché non si aggiunge un elemento.

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

Un altro avviso, NON RACCOMANDATO. Questo è un bel po 'di overhead, e non ne vale la pena (IMO). Ma hey, a ciascuno il proprio. Questo codice è completamente non testato, e basta buttarlo là fuori nel caso in cui hai davvero bisogno di questo per funzionare (che non dovrebbe mai essere il caso, meglio cercare alternative). La parte peggiore è che la dichiarazione di gruppo si trova praticamente all'interno di ListItem stesso, in questo modo è possibile modificare il gruppo piuttosto facilmente.

Ultimo avvertimento, NON RACCOMANDATO.

Modifica: ho modificato il codice sopra per essere metodi di estensione su oggetti ListView, in questo modo si ha accesso diretto a ListView dai metodi. Ogni volta che aggiungi un gruppo, devi semplicemente chiamare listView.AddGroup, aggiungendo un elemento che puoi utilizzare dei metodi listView.AddItem. Questo è contrario ai metodi listView.Items.Add e listView.Groups.Add. L'unica cosa da tenere a mente è che non è necessario assegnare elementi ai gruppi, ma solo assegnare i gruppi agli elementi. In questo modo è possibile passare da un gruppo all'altro modificando il riferimento, invece di dover rimuovere/aggiungere riferimenti tra gruppi. Ciò presuppone anche che tu abbia dichiarato che lo(in altre parole, new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)) è lodi ListItemGroup (in altre parole, devi semplicemente modificare la logica entro AddItem per fare riferimento al valore corretto (che è Name, di solito)

+0

come si può usare questo codice, ne hai un campione? – walter

0

"Mi sono imbattuto nello stesso problema all'inizio di quest'anno considerando la visualizzazione di gruppi vuoti. Microsoft, by-design, non visualizza il nome di un gruppo vuoto di elementi. crea/aggiungi un oggetto o elemento vuoto contenente un carattere vuoto di testo al gruppo Quando hai elementi di dati effettivi da compilare per quel gruppo, devi ricordare di eliminare l'elemento vuoto/vuoto da quel gruppo. "

Fonte: http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/39681a70-d992-4046-ad7e-21a2e33791b1

4

Better ListView può fare esattamente questo.C'è un ShowEmptyGroups proprietà che fa il trucco:

empty group in Better ListView

C'è anche un Meglio ListView espresso, che è freeware e supporta i gruppi pure. Non è un wrapper ListView, ma un completo re-implementazione di tutte le funzionalità, 100% gestito e appena fatto ... meglio :-)

+0

+1 sembra bello, ho provato Better ListView Express – walter

3

questo metodo si assicura il ListViewGroup mostra

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(); 
       } 
      } 
     } 
    } 
}