2010-11-02 8 views
6

Ho un controllo ListView senza colonne.Come aggiungere un'intestazione di colonna a un controllo ListView in C#

un elenco

List<String> MyList=new List<string>(); 

ho bisogno di creare colonne per ogni elemento della lista MyList nel ListView accordo tra di loro colonna per numero di serie.

Per esempio, se MyList contiene "A", "B" ,"C"

poi la visualizzazione elenco sarà come

alt text

So che possiamo fare questo usando for o foreach ciclo come

listView1.Columns.Add("S.No") 
for(int i=0;i<MyList.Count;i++) 
    { 
     listView1.Columns.Add(MyList[i]) 
    } 

ma esiste un modo per farlo usando LINQ o LAMBDA Expression?

risposta

4
MyList.ForEach(name => listView1.Columns.Add(name)); 
+0

ho bisogno di aggiungere la colonna "S.No" con questo. –

+3

Non è necessario aggiungere S.No con Linq. Linq è solo una scorciatoia per scrivere loop che rende il codice leggibile, niente di più. Se è necessario, aggiungere S.No come primo elemento nell'elenco utilizzando InsertAt dell'elenco. – Aliostad

0

solo per fare un po 'più chiaro ciò che Aliostad scritto e ciò che i commenti qui sotto questa risposta significa:

Così si hanno attualmente questo codice:

listView1.Columns.Add("S.No") 
for(int i=0;i<MyList.Count;i++) 
{ 
    listView1.Columns.Add(MyList[i]) 
} 

Come già si menzionato possibile scrivilo anche con un foreach. Questo sarebbe simile al seguente:

listView1.Columns.Add("S.No") 
foreach(var item in MyList) 
{ 
    listView1.Columns.Add(item) 
} 

Nel secondo esempio si itera anche sopra l'elenco. Tutto ciò nasconde la variabile dell'indice locale i.

Con questo terzo esempio non si è intenzione di nascondere anche questa iterazione in una funzione che ha bisogno di un'azione che cosa fare con ogni elemento dell'elenco:

listView1.Columns.Add("S.No") 
MyList.ForEach(name => listView1.Columns.Add(name)); 

Sotto il cofano ancora itera su tutti gli elementi ed esegue alcune funzionalità su ciascun elemento. Non scrivi il ciclo da solo, ma ciò non significa che sia in alcun modo più veloce o migliore del tuo approccio. È solo un altro (più breve) modo per dire cosa vuoi ottenere.

4

Qui ci sono 4 opzioni
ci sono almeno altri 10 modi per fare questo,

var myList = new List<string>() { "A", "B", "C" }; 

// 1: Modify original list and use List<>.ForEach() 
myList.Insert(0, "S. No"); 
myList.ForEach(x => lisView.Columns.Add(x)); 

// 2: Add first column and use List<>.ForEach() 
listView.Columns.Add("S. No"); 
myList.ForEach(x => listView.Columns.Add(x)); 

// 3: Don't modify original list 
(new[] { "S. No" }).Concat(myList).ToList() 
    .ForEach(x => listView.Columns.Add(x)); 

// 4: Create ColumnHeader[] with Linq and use ListView.Columns.AddRange() 
var columns = (new[] { "S. No"}).Concat(myList) 
    .Select(x => new ColumnHeader { Text = x }).ToArray(); 
listView.Columns.AddRange(columns); 

Avete considerato l'opzione KISS?

Problemi correlati