bjwaldo Ответов: 3

Я пытаюсь перечислить значения в listview и, похоже, получаю ошибку.


Listview создается таким образом при загрузке приложения:
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Desktop" });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Documents" });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Downloads" });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Music" });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Pictures" });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + "Videos" });


Код, который я использую для его перечисления, выглядит следующим образом:
int column = 1;
 foreach (System.Windows.Forms.ListViewItem item in ListView1.Items)
 {
     string source = item.SubItems[column].Text;
     MessageBox.Show(source);
 }


Ошибка, которую я получаю, когда нажимаю на кнопку, выглядит следующим образом:
System.InvalidCastException
  HResult=0x80004002
  Message=Unable to cast object of type 'Folders' to type 'System.Windows.Forms.ListViewItem'.
  Source=Backup Tool
  StackTrace:
   at Backup_Tool.MainWindow.FldBackup_Click(Object sender, RoutedEventArgs e) in C:\Users\brian\source\repos\Backup Tool\Backup Tool\MainWindow.xaml.cs:line 95
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
   at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at Backup_Tool.App.Main()


Что, черт возьми, я делаю не так? Надеюсь, кто-нибудь сможет помочь. Я использую Visual Studios 2019 для создания приложения WPF Grid.

Что я уже пробовал:

Я пробовал перечислять как строку различными способами, но нада... Предложения?

3 Ответов

Рейтинг:
2

AnkushK1

Это происходит потому, что ваша коллекция элементов ListView относится к типу папок, которые вы приводите в ListViewItem. Попробуйте следующий способ

foreach (Folders item in ListView1.Items)
{
    //string source = item.SubItems[column].Text; //this would now be "pth" property
    MessageBox.Show(source);
}


Рейтинг:
12

phil.o

Во-первых, вы должны использовать встроенный способ получения папок пользователей, как это предлагается в решении 2:

ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) });
ListView1.Items.Add(new Folders() { pth = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads") });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) });
ListView1.Items.Add(new Folders() { pth = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos) });
Примечание предпочтительное использование Путь.Комбинированный Метод (Система.IO) | Microsoft Docs[^] для построения пути вместо использования конкатенаций строк.

Затем вы можете перечислить элементы таким образом:
foreach (Folders item in ListView1.Items.Cast<Folders>())
{
     string source = item.pth;
     MessageBox.Show(source);
}


bjwaldo

Вы, ребята, потрясающие. Я только начинаю с этого, и любая помощь очень ценится.

Рейтинг:
1

Richard MacCutchan

Вы должны использовать полное имя перечисления для нужных папок, как указано в разделе Окружающая среда.Перечисление Специальных Папок (System) | Microsoft Docs[^]. Таким образом, вы получаете полный путь в виде строки, которую можно вставить прямо в ListView.