我有这个 FolderBrowseDialog

  FolderBrowserDialog fbd = new FolderBrowserDialog();
        fbd.ShowNewFolderButton = true;
        fbd.RootFolder = Environment.SpecialFolder.MyComputer;

        if (fbd.ShowDialog() == DialogResult.OK)
        {
            string folder = fbd.SelectedPath;
            foreach (string f in Directory.GetFiles(folder))
                this.listView1.Items.Add(f);
        }

我想将 ListView1 中的所有歌曲添加到 axwindowsmediaplayer 播放列表中。我将如何实现这一目标?

最佳答案

ListViewItemCollection 没有实现通用的 ICollection<T>IEnumerable<T> 接口(interface),因此编译器无法通过查看 Items 集合来猜测类型。因此,为什么您必须明确告诉 foreach 循环它正在迭代 ListViewItem 类型的集合,而不是使用 var

因此以下代码有效:

var myPlayList =
      axWindowsMediaPlayer1.playlistCollection.newPlaylist("MyPlayList");

foreach (ListViewItem media in listView1.Items)
{
      var mediaItem = axWindowsMediaPlayer1.newMedia(media.Text);
      myPlayList.appendItem(mediaItem);
}

axWindowsMediaPlayer1.currentPlaylist = myPlayList;

当您使用隐式类型变量 ( listView1.Items ) 在 foreach 循环中迭代 var 时, media 被视为 object 。因此,当您调用 ToString() 时,实际上是在 ListViewItem 上调用它。与许多其他 .NET 类一样 - ListViewItem 覆盖了 System.Object.ToString() 方法。看起来像这样:
public override string ToString()
{
    return "ListViewItem: {" + this.Text + "}";
}

因此,当您使用 foreach (var media in listView1.Items) 并调用 axWindowsMediaPlayer1.newMedia(media.ToString()) 时会发生什么,您实际上是在调用 axWindowsMediaPlayer1.newMedia("ListViewItem: { C:\\Users\\...\\file.mp3 }";) 这显然不起作用。

但是,您可以通过将迭代的每个项目转换为 var 来成功使用 ListViewItem,如下面的代码所示。
        foreach (var media in listView1.Items)
        {
            var fileLocation = (ListViewItem)media; // This step is critical!
            var mediaItem = axWindowsMediaPlayer1.newMedia(fileLocation.Text);
            myPlayList.appendItem(mediaItem);
        }

但我认为这在很大程度上违背了使用 var 的初衷。

关于c# - C# 中的播放列表 (axWindowsMediaPlayer),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18752826/

10-12 02:50