Piszę program w C# i mam dość podstawowy problem… Program wyszukuje pliki o danym rozszerzeniu na dysku (obrazki). Po wyszukaniu wszystko jest umieszczane w listView. Po czym użytkownik po podwójnym kliknięciu może otworzyć dany obrazek z listy w nowym oknie(formie). Na liście mam dwie kolumny - nazwa pliku i adres katalogu w którym się znajduje.
Jak mogę te dwie rzeczy wpisać do stringa? Jest mi to potrzebne bo właśnie stringiem przekazuje dane do drugiej formy.
ListView.SelectedListViewItemCollection items = listView1.SelectedItems;
string imagePath = null;
// Najlepiej ustaw MultiSelect na False we właściwościach ListView.
// Wówczas warunek Count == 1 nie będzie potrzebny
if (items != null && items.Count == 1)
{
// Jeśli zawsze dwie kolumny będą mieć wartość to możesz wywalić ten warunek
if (items[0].SubItems.Count == 2)
imagePath = items[0].SubItems[0].Text + items[0].SubItems[1].Text;
}
Nie to nie to. Ten kod wygląda ok. Choć jakby się uprzeć to linijkę
string dir = fi.FullName.Substring(0, fi.FullName.Length - fi.Name.Length);
wypadałoby wywalić poza pętlę. Po co dla np. 1000 plików w tym samym katalogu za każdym razem odczytywać jego ścieżkę, skoro dla każdego z nich jest taka sama? Ale to tak poza tematem.
Mówię ja nie ogarniam tego błędu. IMO jest bez sensu.
Po pierwsze można sobie pobrać tablicę gotowych obiektów FileInfo z katalogu za pomocą DirectoryInfo.GetFiles().
Po drugie, skoro w tym przypadku dostępne są już pełne ścieżki do plików (z wywolania Directory.GetFiles()), to można z nich wyciągnąć zarówno nazwy plików, jak i nazwy katalogów używając odpowiednio Path.GetFileName() oraz Path.GetDirectoryName(). Z tym, że tej ostatniej wcale nie trzeba, bo jest przecież dostępna w argumencie directory.
Czyli zamiast:
foreach (string f in files)
{
FileInfo fi = new FileInfo(f);
ListViewItem item = new ListViewItem(fi.Name);
string dir = fi.FullName.Substring(0, fi.FullName.Length - fi.Name.Length);
item.SubItems.Add(dir);
lstFiles.Items.Add(item);
}
Można po prostu:
foreach (string f in files)
{
ListViewItem item = new ListViewItem(Path.GetFIleName(f));
item.SubItems.Add(directory);
lstFiles.Items.Add(item);
}
Nie ma sensu niepotrzebnie tworzyć obiektów FileInfo, które trochę “ważą”.
Cóż… błąd był przez przeoczenie:/ - zła nazwa listy, widać śpiący już byłem. somekind ma racje kod porąbany… ale co dostałem na tym pracuje - ma być to praca wspólna.