【问题标题】:How to drag and drop mp3 files to a listbox without the file path?如何在没有文件路径的情况下将 mp3 文件拖放到列表框中?
【发布时间】:2015-01-20 06:06:08
【问题描述】:

我在使用 C# 制作的媒体播放器时遇到了一些问题,我已经在 stackoverflow 中询问了另一个问题,但现在我有一个不同的问题,我认为这是最后一个问题。

我想将 MP3 和 WAV 文件拖放到 windows 窗体中的列表框中,我可以正确拖放它们,但是如果不显示文件的完整路径,我就无法播放它们。

这是我到目前为止所做的:

private void listBox1_DragDrop(object sender, DragEventArgs e)
    {

        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
        foreach (string m in files)
        {
            listBox1.Items.Add(Path.GetFileNameWithoutExtension(m));
            mediaList.Add(m);
        }

mediaList 是一个帮助我保存播放列表的列表。 listbox1 是我的主要播放列表。

为了播放歌曲,我使用这个代码,它一直运行良好,直到现在:

axWindowsMediaPlayer1.URL = mediaList[listBox1.SelectedIndex];

提前致谢。 -ChrisCreateBoss

【问题讨论】:

  • 著名的遗言 :) >> 我已经在 stackoverflow 中询问了另一个问题,但现在我有一个不同的问题,我认为这是最后一个问题
  • xD,我的意思是我认为这是我在这个项目中遇到的最后一个问题。

标签: c# .net listbox axwindowsmediaplayer


【解决方案1】:

列表框项目可以包含对象。由于您想访问全名,但仅显示文件名,因此此类将存储删除的全名,但仅显示文件名部分。当为每个项目保存几位信息时,这些很方便。

class FileItem
{
    public string FullName { get; set; }
    public FileItem(string file)
    {
        FullName = file;
    }

    public override string ToString()
    {
        return Path.GetFileNameWithoutExtension(FullName);
    }
}

整个名称被保存,但只有短名称会使用覆盖显示。当文件被删除时,我们将从它们创建 FileItem 对象。然后有2个选择:
a) 将对象放在 ListBox 中并去掉 mediaList,或者
b) 将新项目放入 medialist 并将其用作数据源

这是第二个,因为 mediaList 没有粘在 UI 上。一定要改mediaList如图:

// new mediaList 
List<FileItem> mediaList = new List<FileItem>();
...
private void lb1_DragDrop(object sender, DragEventArgs e)
{
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    foreach (string f in files)
    {
        mediaList.Add(new FileItem(f));
    }
    // tell the LB to display whatever is in mediaList
    lb1.DataSource = mediaList;
}

而不是 2 个文件副本,mediaList 中的内容也显示在 ListBox 中;其中的FileItem 对象将只显示短名称。您的原始代码应该可以进行调整:

axWindowsMediaPlayer1.URL = mediaList[lb1.SelectedIndex].FullName;

否则没有 DataSource,您需要将 Items 转换回 FileItem 并使用 FullName 来获取原始完整路径名:

FileItem fil = (FileItem) lb1.Items[lb1.SelectedIndex];
axWindowsMediaPlayer1.URL = fil.FullName;

// or 
axWindowsMediaPlayer1.URL = ((FileItem)lb1.SelectedItem).FullName;

【讨论】:

  • 当我尝试播放歌曲时,它向我显示此错误:“对对象的引用未建立为对象的实例”(使用您提供的类和代码)
  • 编辑您的帖子以显示您如何尝试播放它...这也不是实际的错误消息
  • 无法将 int 转换为类型“MediaPlayer.Form1.FileItem”??
  • 有没有办法将完整路径添加到 mediaList 并在列表框中显示文件名?因为现在我可以播放拖动的文件了。
  • 我刚刚修改了答案 - 使用 mediaList 作为数据源 - 不需要 2 个文件副本(一个在 LB 中,一个在 mediaList 中)。我第一次回答时不知道 mediaList 是什么,所以我只提到了 DS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多