4

私はこの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 プレイリストに追加したいと考えています。どうすればこれを達成できますか?

4

2 に答える 2

4

ListViewItemCollectionジェネリックICollection<T>またはIEnumerable<T>インターフェイスを実装していないため、コンパイラはItemsコレクションを見て型を推測できません。したがって、使用する代わりにforeach型のコレクションを反復処理していることをループに明示的に伝える必要があるのはなぜですか。ListViewItemvar

したがって、次のコードが機能します。

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ループ内を反復処理すると、は のように扱われます。したがって、 を呼び出すときは、実際には で呼び出していることになります。他の多くの .NET クラスと同様に、メソッドをオーバーライドします。次のようになります。varmediaobjectToString()ListViewItemListViewItemSystem.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しかし、これはそもそも使用するポイントの多くを無効にすると思います。

于 2013-09-12T00:33:22.533 に答える
1

このようなものが動作するはずです:

var pathToFiles = "Path to where the media files are stored";

var mediaPlayer = new AxWMPLib.AxWindowsMediaPlayer();
var myPlaylist = mediaPlayer.playlistCollection.newPlaylist("myPlaylist");

foreach (ListViewItem fileName in listView1.Items) {
  var media = mediaPlayer.newMedia(Path.Combine(pathToFiles, fileName.Text);
  myPlaylist.appendItem(media);
}

mediaPlayer.currentPlaylist = myPlaylist;
于 2013-09-11T23:19:03.053 に答える