Добавляю аудио файлы в ListBox нажатием на Button. Далее срабатывает OpenFileDialog (код ниже). После использую добавленные файлы в ListBox для воспроизведения (код ниже). Нажимаю на button_play и идет воспроизведение. Вопрос такой. Что изменить, чтобы воспроизведение не выбирало строку по SelectedIndex, а по просто выделенной в данный момент курсором строке.
private void button_add_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
label_load.Text = list_catalog.Items.Count.ToString();
}
private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
foreach (String file in openFileDialog1.FileNames)
{
if (list_catalog.Items.Contains(Vars.GetFileName(file)))
{
}
else
{
Vars.Files.Add(file);
list_catalog.Items.Add(Vars.GetFileName(file));
hello.Visible = false;
}
}
}
private void button_play_Click(object sender, EventArgs e)
{
string current = Vars.Files[list_catalog.SelectedIndex];
Vars.CurrentTrackNumber = list_catalog.SelectedIndex;
BassLike.Play(current, BassLike.Volume);
label_time1.Text = TimeSpan.FromSeconds(BassLike.GetPosOfStream(BassLike.Stream)).ToString();
label_time2.Text = TimeSpan.FromSeconds(BassLike.GetTimeOfStream(BassLike.Stream)).ToString();
xrewind.Maximum = BassLike.GetTimeOfStream(BassLike.Stream);
xrewind.Value = BassLike.GetPosOfStream(BassLike.Stream);
timer1.Enabled = true;
}
public static class Vars
{
public static Form1 Link;
public static string AppPath = AppDomain.CurrentDomain.BaseDirectory;
public static List<string> Files = new List<string>();
public static int CurrentTrackNumber;
public static string GetFileName(string file)
{
string[] tmp = file.Split('\\');
return tmp[tmp.Length - 1];
}
public static void DeleteFile(int num)
{
try
{
Files.RemoveAt(num);
}
catch
{
}
}
}
После того, как Вы делаете list_catalog.Sorted = true, у Вас сортируется list_catalog, а Vars.Files остается таким же. Поэтому и выбирается не то, что нужно. Вы можете по имени выбранного в listBox1 элемента найти элемент с этим же именем в Vars.Files:
private void button_play_Click(object sender, EventArgs e)
{
// Изменена одна строка
string current = Vars.Files.Where(x => x == (string)list_catalog.SelectedItem).Single();
Vars.CurrentTrackNumber = list_catalog.SelectedIndex;
BassLike.Play(current, BassLike.Volume);
label_time1.Text = TimeSpan.FromSeconds(BassLike.GetPosOfStream(BassLike.Stream)).ToString();
label_time2.Text = TimeSpan.FromSeconds(BassLike.GetTimeOfStream(BassLike.Stream)).ToString();
xrewind.Maximum = BassLike.GetTimeOfStream(BassLike.Stream);
xrewind.Value = BassLike.GetPosOfStream(BassLike.Stream);
timer1.Enabled = true;
}
Update
Vars.Files содержит полные имена файлов, а list_catalog - имена без пути. И пытаясь найти значения из list_catalog, равные значениям из Vars.Files, естественно, получили InvalidOperationException. Тогда нужно смотреть в какой из строк Vars.Files содержится строка из list_catalog:
string current = Vars.Files.Where(x => x.Contains((string)list_catalog.SelectedItem)).Single();
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники