【问题标题】:C# adding multiple images to same column in objectlistviewC#将多个图像添加到objectlistview的同一列
【发布时间】:2019-09-25 08:00:28
【问题描述】:

我尝试将图像添加到我的第一列(以后可能会更改为另一列,它现在在第一列),到目前为止我已经这样做了

if (item.Index == 0)
{
    item.ImageGetter = delegate (object RowObj)
    {
        return ((RowObjectModel)RowObj).ImageToShow.ToString();
    };
}

这部分在开始时,我使用自定义标题样式并将其应用于构造函数,同时我也执行 ImageGetter 部分。我也这样设置我的 SmallImageList

ImageList IList = new ImageList();
IList.Images.Add("MyIcon", Properties.Resources.MyIcon);
mainForm.objListview.SmallImageList = IList;

这段代码有 2 个问题,首先我无法设置图像。它没有显示在我的列表视图中。 我要做到这一点是这样的:

(objListview.GetItem(z).RowObject as RowObjectModel).ImageToShow = ThumbnailImages.MyIcon;

我的枚举是这样的:

public enum ThumbnailImages
{
    NULL = 0,
    MyIcon = 1,
    MyIcon2 = 2,
    MyIcon3 = 3,
    MyIcon4 = 4,
    MyIcon5 = 5
}

第二个问题是我根本不知道如何在同一行的同一列中添加第二张图像。我什至不确定这是否可能。但我必须以某种方式做到这一点,所以我对任何想法持开放态度。

编辑: 好的,我找到了第一个问题的解决方案。我没有使用 UpdateObject/UpdateObjects 方法。我用正确的图像标记了我的所有物品,它们应该显示并使用这种方法,一切正常。现在我只需要找到一种方法在 1 个单元格中同时显示 2 个图像。

编辑 2: 关于我的第二个问题,我发现了这个类--> ImagesRenderer

http://objectlistview.sourceforge.net/cs/ownerDraw.html#imagesrenderer

但到目前为止我找不到任何可行的解决方案,而且我不知道它是如何工作的?

【问题讨论】:

    标签: c# objectlistview


    【解决方案1】:

    现在我只需要找到一种方法在 1 个单元格中同时显示 2 个图像。

    您可以通过显示包含两个图像的 1 个图像来解决显示 2 个图像的要求。下面的例子就是这样做的。需要注意的是,您可能应该在所有组合之前构建一个缓存,以便您可以高速返回它们,而不是在 ImageGetter 委托中构建它们

    olv.ShowGroups = false;
    
    //make 2 images
    var img1 = new Bitmap(10, 10);
    var g = Graphics.FromImage(img1);
    g.FillRectangle(new SolidBrush(Color.Pink),2,2,8,8 );
    
    var img2 = new Bitmap(10, 10);
    var g2 = Graphics.FromImage(img2);
    g2.FillRectangle(new SolidBrush(Color.Blue),2,2,8,8 );
    
    var col1 = new OLVColumn();
    col1.AspectName = "ToString";
    
    col1.ImageGetter += delegate(object rowObject)
    {
        if(rowObject == "1")
            return img1;
    
        if(rowObject == "2")
            return img2;
    
        if (rowObject == "3")
        {
            var comboImg = new Bitmap(img1.Width + img2.Width, img1.Height + img2.Height);
            using (var g3 = Graphics.FromImage(comboImg))
            {
                g3.DrawImage(img1,new Point(0,0));
                g3.DrawImage(img2,new Point(img1.Width,0));
            }
    
            return comboImg;
        }
    
    
        return null;
    };
    
    olv.Columns.Add(col1);
    
    olv.AddObject("1");
    olv.AddObject("2");
    olv.AddObject("3");
    
    }
    

    【讨论】:

    • 感谢您的回答。这向我展示了如何在我的应用程序上做到这一点。我已经更改了它,如果有人需要,我也会发布我的解决方案
    【解决方案2】:

    感谢@Thomas N,我找到的解决方案是 --->

    在我的 objectlistview 初始化程序中,我这样做了:

    item.Renderer = new ImageRenderer();
    item.AspectGetter = delegate (object RowObj)
    {
        return ((RowObjectModel)RowObj).ImagesToShow;
    };
    

    item 在这里代表第 0 列。我正在迭代我的所有列以应用 HeaderFormatStyle。我想我也可以在这里做。

    在我做这个初始化程序之前,我还设置了我的图像

    ImageList IList = new ImageList();
    IList.Images.Add("NULL", Properties.Resources.Null);
    IList.Images.Add("MyIcon", Properties.Resources.MyIcon);
    IList.Images.Add("MyIcon2", Properties.Resources.MyIcon2);
    IList.Images.Add("MyIcon3", Properties.Resources.MyIcon3);
    IList.Images.Add("MyIcon4", Properties.Resources.MyIcon4);
    IList.Images.Add("MyIcon5", Properties.Resources.MyIcon5);
    objListview.SmallImageList = IList;
    

    我所要做的就是调用我在模型类中编写的方法

    public void AddThumbnailImage(ThumbnailImages tImage)
            {
                if (tImage == ThumbnailImages.NULL)
                {
                    ImagesToShow.Clear();
                }
                else
                {
                    if (!ImagesToShow.Contains((int)tImage))
                        ImagesToShow.Add((int)tImage);
                }
            }
    

    我知道我的解决方案与您的 Thomas 非常相似,但我只是想展示一下我是如何做到的 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多