Нужно выводить на 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));
};
}
Это награмождение работает, не идеально, но работает
Что-то вроде такого получилось, на основании вашего же ответа.
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, в событии нажатия кнопки оставлять это нельзя.