C# listView - wczytanie do stringa wartość kolumny


(LonngerM) #1

Witam

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.


(Tomek Matz) #2

Spróbuj coś takiego

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;

}

(LonngerM) #3

Przy

if (items[0].SubItems.Count == 2)

Wyskakuje mi

Wcześniej miałem takie same błędy z odczytywaniem dlatego napisałem tutaj... już nie wiedziałem co zrobić...


(Tomek Matz) #4

Szczerze to nie mam pojęcia o co chodzi. W ogóle nie rozumiem tego komunikatu błędu.

Wkleiłeś dokładnie taki kod jak podałem? Żeby nie było, testowałem go u siebie i robi to co powinien.


(LonngerM) #5

Kod przekopiowałem całkowicie.... Hmm w takim razie może błąd siedzi przy wypisaniu obiektów na listę. Fragment dostałem od kolegi.

private void FileSearching(string directory, string fileType)

        {

            try

            {

                string[] files = Directory.GetFiles(directory, fileType);

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

                }

                string[] directories = Directory.GetDirectories(directory);

                foreach (string d in directories)

                {

                    FileSearching(d, fileType);

                }

            }

            catch (System.Exception excpt)

            {

                Console.WriteLine(excpt.Message);

            }

        }

(Tomek Matz) #6

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.


(LonngerM) #7

A może ja mam złe zdarzenie? Bo co jak co dałem tą opcje przy podwójnym kliknięciu, ale może wtedy nie jest to wyłapywane poprawnie.


(Tomek Matz) #8

Ja też testowałem to u siebie na DoubleClick-u. Ściągnij ten projekt i zobacz, czy u Ciebie to zadziała.

http://rapidshare.com/files/440628570/WindowsFormsApplication2.zip

Najlepiej puść ten swój kod przez debugger i zobacz o co chodzi.


(LonngerM) #9

Działa... cóż... musze przebadać swój kod porządnie:/ nie wiem co jest...


(somekind) #10

Porąbany ten kod niesamowicie.

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żą".


(Tomek Matz) #11

@LonngerM

Jak znajdziesz w czym leży problem to daj znać na forum, bo sam jestem ciekaw.


(LonngerM) #12

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.