Доброе утро!
У меня возник такой вопрос (по причине того, что с событиями никогда не работал), как мне создать событие под следующее описание:
1) Из списка (а именно из DataGriView, по событию CellClick) выбирается музыкальный файл. В списке множество музыкальных файлов. На основе выбранного музыкального файла строится список музыкальных файлов, которые находятся ниже выбранного, строится список до тех пор, пока не достигнут конец списка;
После этой операции у нас есть список музыкальных файлов, обозначим его remainTracksList, которые стоят в очереди на проигрывание.
2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка.
Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList.
Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.
Собственно осталось реализовать только событие, остальное сделал.
Код:
private static List<string> remainTracksList = new List<string>();
// выборка песни из таблицы
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
// если мы нажали на какой-либо трэк из таблицы во время проигрывания, или когда мы остановили проигрывание
// либо когда проигрывание трэков завершено, то есть остановлено
// мы отправляем команду на закрытие проигрывания "close MediaFile";
if ((Player.GetPlayer().IsPlaying()) ||
(Player.GetPlayer().IsPaused()) ||
(Player.GetPlayer().IsStopped()))
{
Player.GetPlayer().Close();
}
this.currentPlayingTrack = this.dataGridView1[this.dataGridView1.Columns["FilePath"].Index,
e.RowIndex].Value.ToString();
this.AddRemainTracks(e.RowIndex);
this.NextTrack();
}
// проигрываем следующий трэк
private void NextTrack()
{
if (trackList.Count != 0)
{
Player.GetPlayer().Play(remainTracksList.First());
remainTracksListt.Remove(remainTracksListt.First());
}
}
// добавляем трэки в remainTracksList ниже текущего проигрываемого трэка
private void AddRemainTracks(int currentTrackIndex)
{
remainTracksList.Clear(); // очищаем список
while (!(this.dataGridView1.RowCount == currentTrackIndex))
{
remainTracksList.Add(this.dataGridView1[this.dataGridView1.Columns["FilePath"].Index,
currentTrackIndex++].Value.ToString());
}
}
Не знаю, правда это или нет, но у меня есть догадка, что нет необходимости создавать событие, а просто передать в следующую функцию (mciSendString) список на проигрышь файлов, но это только догадка.
Функция на основе которой написан класс Player:
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
Для более ясности могу привести код класса Player.
Заранее спасибо!