C#按名称将图像分配给ListView项目

时间:2011-11-16 01:50:55

标签: c# winforms

我要感谢先进的贡献者,我宁愿坚持这一点:

我创建了一个名为listView1的列表视图,当程序运行时,它会从名为treeView1的树视图中指定的特定文件夹中显示数据文件(.txt,.doc等)。在数据文件旁边的这些相同文件夹中是图标文件(.ico)。我想指定.ico显示为将加载到listView1的.txt或.doc文件的图像。数据文件和图标文件都具有相同的名称,只是一个不同的扩展名。因此,我已经有了一种将图标文件与数据文件相匹配的方法。但是,我似乎无法找到一种方法以图形方式将图标文件指定为listView1中要为数据文件显示的图像。我无法使用图像列表,因为您只能根据图像索引而不是图像名称来分配图像列表中的图像。所有迹象似乎都指向创建一个数组,但我无法弄清楚如何将数组中的图像分配给数据文件,同时将其添加到listView1。

我希望这是有道理的,谢谢!

2 个答案:

答案 0 :(得分:5)

将图像文件添加到ImageList后,您肯定可以通过其名称(ImageKey属性)来引用它们。以下代码有效。它相当粗糙,因为我不知道你如何使用数据填充Treeview或Listview。我只是输入了一些测试数据,并使用常用方法填充Treenodes和ListViewItems。

希望这会有所帮助。如果您有疑问,请告诉我。 。

public partial class Form1 : Form
{
    // A Class member variable to hold images, to be used by both the 
    // TreeView AND the ListView:
    ImageList _myImagelist;

    public Form1()
    {
        InitializeComponent();

        // Initialize your memeber variable:
        _myImagelist = new ImageList();

        // Add some hokey test images for this arbitrary example:
        _myImagelist.Images.Add("Image1", Properties.Resources.SomeImage);
        _myImagelist.Images.Add("Image2", Properties.Resources.AnotherImage);

        // Some crude code to populate the list with test data:
        TreeView lst = this.treeView1;
        lst.ShowPlusMinus = true;

        // Set a reference to your member variable:
        lst.ImageList = _myImagelist;

        // Now populate your tree nodes and subnodes:
        TreeNode parent;

        //A parent . . .
        parent = lst.Nodes.Add("FirstNode", "Image One", "Image1");

        //  . . . with children:
        parent.Nodes.Add("P1:S1", "Parent One Child One", "Image1");
        parent.Nodes.Add("P1:S2", "Parent One Child Two", "Image1");

        // Another parent . . .
        parent = lst.Nodes.Add("SecondNode", "Image Two", "Image2");

        // . . . More children:
        parent.Nodes.Add("P2:S1", "Parent Two Child One", "Image2");
        parent.Nodes.Add("P2:S2", "Parent Two Child Two", "Image2");
    }


    // Event handler for the AfterSelect Event:
    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeNode nd = e.Node;
        this.FillList(nd);
    }


    private void FillList(TreeNode node)
    {
        ListView lv = this.listView1;
        lv.View = View.List;

        // Set the reference to your same member variable:
        lv.SmallImageList = _myImagelist;
        lv.Items.Clear();

        foreach (TreeNode nd in node.Nodes)
        {
            // The Listview also has an override of the .Add method which accepts the image KEY as
            // an argument. The nd.ImageKey property returns a string, which the ListView item recognizes
            // as the key for an item in the referenced ImageList:
            ListViewItem newItem = new ListViewItem(nd.Text, nd.ImageKey);
            lv.Items.Add(nd.Name, nd.Text, nd.ImageKey);
        }

    }
}

答案 1 :(得分:0)

内存不足是指文件类型“.rfa”,它也位于带有bmps的文件夹中。添加此条件过滤器后,不再出现内存不足错误。

//Add images from file name to list
if (file.Extension.Contains(".bmp")){
    imageList.Images.Add(Bitmap.FromFile(string.Format("{0}", file.FullName)));
    listView_Families.LargeImageList = imageList;
}