Изменить выбор в ListBox

321
27 мая 2017, 14:56

Добавляю аудио файлы в 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
        {
        }
    }
}
Answer 1

После того, как Вы делаете 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();
READ ALSO
Как называется такая форма записи?

Как называется такая форма записи?

Есть два класса Human и StudentПусть, Student наследуется от Human

256
Чтение файла .adm

Чтение файла .adm

Есть задача - программа проверки правописанияВ качестве словаря должен быть использован файл типа

344
Замена данных в исходящем POST по условию

Замена данных в исходящем POST по условию

Есть radio-переключатель, имеет name="group"

278
Нет кнопки удалить запись phpmyadmin

Нет кнопки удалить запись phpmyadmin

Установил phpmyadmin, добавил запись в таблицу, а удалить или редактировать запись кнопки нет, непонимаю в чем проблема, ос manjaro - linux

433