C # добавление нескольких изображений в один столбец в objectlistview - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь добавить изображение в свой первый столбец (это может быть изменено на другой столбец позже, сейчас он находится в первом столбце), пока что мне нужно сделать

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.Я пометил все свои вещи соответствующими изображениями, которые они должны показать, и использовал этот метод, и все работало.Теперь все, что мне нужно, это найти способ показывать 2 изображения одновременно в 1 ячейке.

РЕДАКТИРОВАТЬ 2: о моей второй проблеме я нашел этот класс -> ImagesRenderer

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

Но я так и не смог найти какое-либо рабочее решение, и я не имею ни малейшего представления о том, как это работает?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Теперь все, что мне нужно, это найти способ показать 2 изображения одновременно в 1 ячейке.

Вы можете обойти требование показать 2 изображения, показав 1 изображениекоторый содержит оба.Пример ниже делает это.Следует отметить, что вам, вероятно, следует создать кэш заранее всех комбинаций, чтобы вы могли возвращать их с высокой скоростью, а не строить их в делегате ImageGetter

enter image description here

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");

}
0 голосов
/ 27 сентября 2019

Решение, которое я нашел благодаря @Thomas N, заключалось в следующем --->

В моем инициализаторе objectlistview я сделал это:

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

элемент представляет здесь столбец 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);
            }
        }

Я знаю, что мое решение очень похоже на ваше, Томас, но я просто хотел показать, как я это сделал:)

...