如何修复ListView.LargeImageList两次显示图像

时间:2019-05-07 21:23:25

标签: c# winforms listview imagelist

我正在开发一个软件,该软件可以比较模因并帮助用户在计算机上组织模因。作为其一部分,我正在使用Windows.Forms来构建UI。用户界面使用户可以添加要检查图像的文件夹,可以将其与一组已知的模因模板进行比较。 当我尝试向用户显示找到的图像时,就会出现我的问题。为此,我使用ListView和属性LargeImageList来包含图像的元组和图像文件的名称。

这是有问题的代码:

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    var ic = new ImageCollection();
    var fbd = new FolderBrowserDialog();
    fbd.Description = "Select meme folder or image.";
    if (fbd.ShowDialog() == DialogResult.OK)
    {
        string[] files = Directory.GetFiles(fbd.SelectedPath);
        foreach (var file in files)
        {
            if (!ic.CheckIfImage(file)) continue;
            imageList1.Images.Add(Image.FromFile(file));

        }

        foreach (var file in files)
        {
            listView1.Items.Add($"{Path.GetFileNameWithoutExtension(file)}", i++);
        }
    }
}

This是用户首次加载到文件夹时看到的示例。当用户尝试在另一个文件夹中加载时,this发生了。它显示第一个文件夹中的图像,以及第二个文件夹中的图像文件的名称。

有人知道此问题的解决方法吗?为了解决这个问题,我尝试了多种选择。从尝试清除包含图像的ImageList到尝试控制ListView更新的全部时间。这些都不起作用。我也尝试过搜索该问题,但没有找到解决办法的运气。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您想一次显示单个文件夹的内容,请处理ImageList中的对象。

如果您想显示多个文件夹的内容,则需要指定所添加图像的新索引。而是使用相同的索引引用在ListView中添加新项:

CREATE PROCEDURE [dbo].[SP_User_Case_Answer_Found]
    @userID BIGINT,
    @visitID BIGINT
AS
   return (SELECT count (*) 
    FROM User_Case_Answer
    WHERE userID = @userID
    AND pvisitID = @visitID)

索引器(int i = 0; //(...) listView1.Items.Add($"{Path.GetFileNameWithoutExtension(file)}", i++); )始终从i开始,因此ListView项将每次使用0中的Image来使用Imagelist中的图像。新图像将永远不会显示。

您可以使用Index[0]值(表示已添加到ImageList的图像数)作为基础,并从此值开始增加索引器:

ImageList.Images.Count

如果允许从ListView中删除图像,则还应该将其从ImageList中删除:这意味着您需要重新索引所有ListView项,这些项从删除的项之后的项开始。
记住要处置从ImageList中删除的Image。