我有这个 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/