Я использую два windows forms
, первая форма будет иметь несколько файлов изображений заселенных в datagridview
и на второй форме все эти изображения размещены в другом datagridview
управления, второй datagridview
управления есть кнопка, как Delete Image
что удалит файл.
после того, как я нажму кнопку «Исключение кнопки», возникает, когда файл используется. но я alread разместил datagridview
, а также очистил его строки, но все же он вызывает не освобождение изображения. Я уже пытался позвонить GC.Collect();
Метод, но это не помогло. мой пример кода ниже.
памяти/ресурсов не выпустили
На первой форме:
// Commenting the code above
if (validuser)
{
dgvImages.Rows.Clear();
dgvImages.Dispose();
GC.Collect();
var form = new NewForm();
form.Show();
this.Hide();
}
и на второй форме:
private void dgvImages_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
if (e.ColumnIndex == 1)
{
string selectedpath = dgvImages.Rows[e.RowIndex].Cells[2].Value.ToString(); // this cell contains the full path of the image
if (File.Exists(selectedpath))
{
dgvImages.Rows.Clear();
dgvImages.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(selectedpath);
LoadImages();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // File is in use
}
}
EDIT: Вот как я загрузка изображений
private void LoadImages()
{
if (Directory.Exists(path))
{
DirectoryInfo dir = new DirectoryInfo(path);
FileInfo[] files = dir.GetFiles();
foreach (var f in files)
{
if (f.Extension.ToLower() == ".jpg" || f.Extension.ToLower() == ".png" || f.Extension.ToLower() == ".bmp" || f.Extension.ToLower() == ".tiff")
{
dgvImages.Rows.Add((Image.FromFile(f.FullName)), "Delete Image" ,f.FullName);
}
}
}
}
Как вы * * погрузочные изображения в сетке? –
Позвольте мне включить мой метод LoadImages(); 'в сообщение тоже! – CodeIt
Ни dgvImages.Rows.Clear(), ни dgvImages.Dispose() будет вызывать метод Dispose() любого из изображений, которые вы используете. DGV не может знать, может ли изображение использоваться в другом месте, поэтому оно не может безопасно это сделать. Вы должны сами позаботиться об этом. GC.Collect() сам по себе тоже недостаточно хорош, вам также нужно вызвать GC.WaitForPendingFinalizers(). Если это еще не освобождает блокировку, вы используете изображение в другом месте. –