2013-07-29 21 views

Odpowiedz

28

ListViewItemCollection jest dokładnie to, co brzmi jak - zbiór ListViewItem elementów. Jest to , a nie zbiór ciągów. Twój kod nie powiedzie się w czasie wykonywania tego samego powodu, że ten kod nie powiedzie się w czasie kompilacji:

ListViewItem item = lvFiles.Items[0]; 
string text = (string) item; // Invalid cast! 

Jeśli chcesz listę łańcuchów, z których każdy jest przenoszony z majątku ListViewItemText można zrobić że łatwo:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(item => item.Text) 
           .ToList(); 
+0

Dlaczego mogę zobaczyć tylko nazwę pliku zamiast całej ścieżki? – user2214609

+2

@ user2214609: Nie mam pojęcia, biorąc pod uwagę, że nie wiedzieliśmy nawet, że 'ListView' zawierał nazwy plików. Wygląda na to, że powinieneś zadać to pytanie jako osobne pytanie - zawartość właściwości 'Text' w' ListViewItem', która jest wypełniona nazwą pliku, jest * bardzo * inną kwestią od konwersji zbioru wartości 'ListViewItem' na'. Lista '. –

+0

Co mogę zrobić, jeśli w ogóle nie mam funkcji Cast lub LINQ? (Projekt WinForm) –

5

Sposób Cast będzie zasadniczo spróbować wykonać Box/unbox, więc nie powiedzie się, jeśli pozycje na liście nie są już łańcuchy. Spróbuj to zamiast:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.ToString()).ToList(); 

Albo ten

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.Text).ToList(); 
+0

Will nie Twój pierwszy przykład daje listę, w której każdy element jest łańcuch „System.Windows.Forms. ListViewItem "? –

+0

Wygląda na to, że da "ListViewItem: {text here}" – Blorgbeard

+0

@AdamV Nie jestem pewien z góry mojej głowy, co zwróci "ListViewItem.ToString" (dlatego podałem alternatywne rozwiązanie). 'ListViewItem' robi [przesłonięcie' ToString'] (http://msdn.microsoft.com/en-us/library/9syath98.aspx), więc zakładam, że robi coś więcej niż tylko zwraca swoją własną nazwę. –

4

spróbować czegoś jak ten

List<string> list = lvFiles.Items.Cast<ListViewItem>().Select(x=> x.ToString()).ToList(); 
+0

@Dvvoter nie zapomnij skomentować –

3

Spróbuj tego za pomocą metody Select:

list tekście:

List<string> listText = lvFiles.Items.Select(item => item.Text).ToList(); 

dla wartości lista:

List<string> listValues = lvFiles.Items.Select(item => item.Value).ToList(); 

Albo, dla obu:

Dictionary<string, string> files = lvFiles.Items.ToDictionary(key => key.Value, item => item.Text); 
Powiązane problemy