Нужно выводить на PictureBox файлы, выбранные в ListBox

Столкнулся с проблемой, было у меня задание, сделать программу для просмотра изображений, выбирать расширение картинок, путь к ним, путь отображать на лейбл. Всё сделал. Дошёл до последнего пункта, "при выборе элемента в листбокс открывать его на пикчербокс". Подумал, что легко, но почесав репу понял, что не могу придумать, как это делать.

string fullPath = FolderBrowserDialog.FileName;
label1.Text = fullPath.Substring(0, fullPath.LastIndexOf('\\'));
string[] files = Directory.GetFiles(fullPath.Substring(0, fullPath.LastIndexOf('\\')));
foreach (string file in files)
{
    listBox1.Items.Add(Path.GetFileName(file));
}
try
{
    pictureBox1.Image = Image.FromFile(FolderBrowserDialog.FileName);
}
catch (Exception)
{
    MessageBox.Show("Не корректный файл. Выберите, пожалуйста, файл с расширением .png|.jpeg|.bmp|.gif","Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Вот этот кусочек, в котором происходит всё и сразу, подвязан на ивент нажатия кнопки(всё вместе подвязано, наверное, так нельзя, но как есть)


Ответы (2 шт):

Автор решения: Кирилл Пачин

В общем, чуточку пошевелив мозгами и собрав по этому поводу коллоквиум, нашёл ответ

foreach (string file in files)
                {
                    listBox1.Items.Add(Path.GetFileName(file));
                    var path = Directory.GetParent(file).FullName;
                    listBox1.SelectedValueChanged += (o, ea) =>
                    {
                        pictureBox1.Image = Image.FromFile(Path.Combine(path,(string)((ListBox)o).SelectedItem));
                    };
                }

Это награмождение работает, не идеально, но работает

→ Ссылка
Автор решения: aepot

Что-то вроде такого получилось, на основании вашего же ответа.

private string path;

private void Button1_Click(object sender, EventArgs e)
{
    string fullPath = FolderBrowserDialog.FileName;
    path = Path.GetDirectoryName(fullPath);
    label1.Text = path;
    string[] files = Directory.GetFiles(path);
    foreach (string file in files)
    {
        listBox1.Items.Add(Path.GetFileName(file));
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    listBox1.SelectedIndexChanged += ListBox1_SelectedIndexChanged;
}

private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (sender is ListBox listBox && listBox.SelectedItem is string fileName && fileName?.Length > 0)
    {
        pictureBox1.Image = Image.FromFile(Path.Combine(path, fileName));
    }
}

Кстати, я не понял, что такое FolderBrowserDialog.FileName - это хитро замаскированный OpenFileDialog? Используйте FolderBrowserDialog, тогда не придется городить костыли с Path.GetDirectoryName().

SelectedIndexChanged лучше вообще в дизайнере формы назначить листбоксу, или оставить в Form1_Load, в событии нажатия кнопки оставлять это нельзя.

→ Ссылка