我已经设置了一个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;
};
但是,没有显示任何内容。
我错过了什么?
尽管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没有任何区别!
我知道这是一个老问题,但我有同样的问题,找不到任何正确的答案。我会留下我的答案,也许这对某人有所帮助。
无论我做什么或我所在的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