RenderDelegate未被调用

问题描述 投票:0回答:2

我已经设置了一个RenderDelegate来绘制不同颜色的单元格文本。我还将OwnerDraw属性设置为true

这是渲染代码:

this.olvInvoiceType.RendererDelegate = delegate (EventArgs re, Graphics g, Rectangle r, object rowObject)
{
    var item= rowObject as MyItem;
    var brush = Brushes.Red;

    g.DrawString(item.Name, olvItems.Font, brush, r);
    return false;
};

但是,没有显示任何内容。

我错过了什么?

c# winforms objectlistview
2个回答
0
投票

尽管ObjectListView网站上的示例表明您实际上必须返回true,而不是false。

我发现的其他例子也是如此。

另外,不要忘记在渲染之前检查对象是否为null,否则会抛出异常!

this.olvInvoiceType.RendererDelegate =  delegate (EventArgs re, Graphics g, Rectangle r, object rowObject)
            {
                var item = rowObject as MyItem;
                if (item != null)
                {
                    //g.FillRectangle(new SolidBrush(this.olvItems.BackColor), r);
                    g.DrawString(item.Name, olvItems.Font, brush, r);
                }
               return true;
            };

当我尝试这个时,我似乎有一个奇怪的问题,即文本被渲染两次,一次是由黑色的控制,然后是另一次由我红色! 这可能是一个错误,或者我可能错过了一些东西。

为了解决这个问题,我必须绘制背景将fillrectangele,但是如果选择了行,那么你就会遇到问题所以你需要单独处理它。

我还发现OwnerDraw没有任何区别!


0
投票

我知道这是一个老问题,但我有同样的问题,找不到任何正确的答案。我会留下我的答案,也许这对某人有所帮助。

无论我做什么或我所在的OwnerRender模式,nameColumn.RendererDelegate都不会被调用。

无论我做什么,nameColumn.Renderer = SomeCustomIRenderer也不会完全被称为。

我设法通过添加以下内容来修复此问题:

treeListView.CellRendererGetter = (object rowObject, OLVColumn column) => new MyCustomIRenderer();在此之后,我的自定义渲染器实际上被调用了。

最简单的方法是覆盖您自己的BaseRenderer或只是从这里复制一个http://objectlistview.sourceforge.net/cs/ownerDraw.html#owner-draw-label

© www.soinside.com 2019 - 2024. All rights reserved.