如何将 mp3 文件拖放到没有文件路径的列表框中?
How to drag and drop mp3 files to a listbox without the file path?
我在使用 C# 制作的媒体播放器时遇到了一些问题,我已经在 Whosebug 中提出了另一个问题,但现在我有一个不同的问题,我认为这是最后一个。
我想将 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
列表框项目可以包含对象。由于您想访问全名,但只显示文件名,因此 class 将存储删除的全名,但只显示文件名部分。当为每个项目保存几位信息时,这些很方便。
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 并将其用作 DataSource
这将执行第二个操作,因为 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;
否则 没有 数据源,您需要将 Items
转换回 FileItem
并使用 FullName 获取原始完整路径名:
FileItem fil = (FileItem) lb1.Items[lb1.SelectedIndex];
axWindowsMediaPlayer1.URL = fil.FullName;
// or
axWindowsMediaPlayer1.URL = ((FileItem)lb1.SelectedItem).FullName;
我在使用 C# 制作的媒体播放器时遇到了一些问题,我已经在 Whosebug 中提出了另一个问题,但现在我有一个不同的问题,我认为这是最后一个。
我想将 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
列表框项目可以包含对象。由于您想访问全名,但只显示文件名,因此 class 将存储删除的全名,但只显示文件名部分。当为每个项目保存几位信息时,这些很方便。
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 并将其用作 DataSource
这将执行第二个操作,因为 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;
否则 没有 数据源,您需要将 Items
转换回 FileItem
并使用 FullName 获取原始完整路径名:
FileItem fil = (FileItem) lb1.Items[lb1.SelectedIndex];
axWindowsMediaPlayer1.URL = fil.FullName;
// or
axWindowsMediaPlayer1.URL = ((FileItem)lb1.SelectedItem).FullName;