Как перетащить mp3-файлы в список без пути к файлу?

У меня возникли некоторые проблемы с медиаплеером, сделанным на 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];

Заранее спасибо. -КрисКреатеБосс


person ChrisCreateBoss    schedule 17.01.2015    source источник
comment
Известные последние слова :) ›› Я уже спрашивал здесь в stackoverflow другую проблему, но теперь у меня другая и я думаю, что она последняя   -  person sudheeshix    schedule 17.01.2015
comment
xD, я имею в виду, что я думаю, что это последняя проблема, которая у меня будет с этим проектом в частности.   -  person ChrisCreateBoss    schedule 17.01.2015


Ответы (1)


Элементы списка могут содержать объекты. Поскольку вы хотите иметь доступ к полному имени, но отображать только имя файла, этот класс будет хранить отброшенное полное имя, но отображать только часть имени файла. Это удобно, когда для каждого элемента нужно сохранить несколько битов информации.

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

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

Полное имя сохраняется, но при переопределении будет отображаться только короткое имя. Когда файлы будут удалены, мы создадим из них объекты FileItem. Тогда есть 2 варианта:
а) поместить объекты в ListBox и избавиться от mediaList или
б) поместить новые элементы в медиалист и использовать его как источник данных.

Это сделает второе, так как mediaList не привязан к пользовательскому интерфейсу. Обязательно измените 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;
person Ňɏssa Pøngjǣrdenlarp    schedule 17.01.2015
comment
Когда я пытаюсь воспроизвести песню, она показывает мне эту ошибку: Ссылка на объект не установлена ​​​​как экземпляр объекта (с использованием предоставленного вами класса и кода) - person ChrisCreateBoss; 17.01.2015
comment
отредактируйте свой пост, чтобы показать, как вы пытаетесь его воспроизвести... это также не фактическое сообщение об ошибке - person Ňɏssa Pøngjǣrdenlarp; 17.01.2015
comment
Не удается преобразовать int в тип MediaPlayer.Form1.FileItem ?? - person ChrisCreateBoss; 17.01.2015
comment
Есть ли способ добавить полный путь к mediaList и показать имя файла в списке? Потому что теперь я могу просто воспроизводить перетаскиваемые файлы. - person ChrisCreateBoss; 17.01.2015
comment
Я просто изменил ответ для этого - используйте mediaList в качестве источника данных - нет необходимости в 2 копиях файлов (одна в LB, одна в mediaList). Я понятия не имел, что такое mediaList, когда впервые ответил, поэтому упомянул только DS. - person Ňɏssa Pøngjǣrdenlarp; 17.01.2015
comment
Да, я знаю, но мне просто нужно показать, например: Get Lucky в списке и добавить C:/Users/username/Documents/Data/Get Lucky.mp3 в mediaList. - person ChrisCreateBoss; 17.01.2015
comment
это то, что делает текущий ответ; именно это использование mediaList в качестве источника данных - person Ňɏssa Pøngjǣrdenlarp; 17.01.2015
comment
так почему я могу просто воспроизводить перетащенные файлы, а не те, которые уже были там. - person ChrisCreateBoss; 17.01.2015
comment
Я не знаю, какие там были или как вы их закодировали. Вы изменили mediaList на mediaList<FileItem>? Я предполагаю, что раньше это была List‹строка› - person Ňɏssa Pøngjǣrdenlarp; 17.01.2015
comment
Вы имеете в виду вот так? List<FileItem> mediaList = new List<string>(); - person ChrisCreateBoss; 17.01.2015
comment
Нет. Это не скомпилируется. Я показал как в ответе. - person Ňɏssa Pøngjǣrdenlarp; 17.01.2015
comment
Хорошо, теперь я могу воспроизводить другие песни, но когда я перетаскиваю файлы в список, они не отображаются. Ну я гтг так что продолжу в воскресенье или понедельник. - person ChrisCreateBoss; 17.01.2015
comment
Эй, эффекты перетаскивания должны быть в .None или .Copy? - person ChrisCreateBoss; 20.01.2015
comment
Извините, это не имеет отношения к опубликованной проблеме. Вы должны нажать галочку рядом с ответом и опубликовать новый вопрос для новых проблем. - person Ňɏssa Pøngjǣrdenlarp; 20.01.2015
comment
Это примерно та же проблема, но после поиска в гугле я обнаружил, что многие люди пишут эту строку кода :DragDropEffects.Copy - person ChrisCreateBoss; 20.01.2015
comment
Сообщение ясно дает понять I can drop them correctly с заголовком, в котором содержится просьба помочь сохранить файлы в listbox without the file path. Все сделано. - person Ňɏssa Pøngjǣrdenlarp; 20.01.2015