在 ObjectListView 中使用 Renderer 和 FormatRow

Using Renderer and FormatRow in ObjectListView

我在使用 ObjectListView 控件时发现了一个问题:http://objectlistview.sourceforge.net/cs/index.html

我想使用 FormatRow 来设置每行的自定义字体和颜色属性。 我还想使用自定义渲染器来插入例如。其中一列中的用户控件。 不过,这两者似乎有些冲突。

代码:

//create some bogus list
List<MyObject> list = new List<MyObject>();
list.Add(new MyObject("Test11", "Test12", "Test13"));
list.Add(new MyObject("Test21", "Test22", "Test23"));
list.Add(new MyObject("Test31", "Test32", "Test33"));

//make the 2nd row red
listView1.FormatRow += delegate (object sender1, BrightIdeasSoftware.FormatRowEventArgs e1) {
    MyObject x = (MyObject)e1.Model;
    if (x.Col1 == "Test21")
    {
        e1.Item.BackColor = Color.Red;
    }
};

//add a custom renderer to col2. This will enable us to insert eg. user controls or do other crazy stuff. 
//when we add this, the FormatRow above wont't work. Even though it isn't in effect. Eg. return false.
olvColumn2.RendererDelegate = delegate (EventArgs e1, Graphics g, Rectangle r, object x)
{
    return false;
};

//set list
listView1.SetObjects(list);

我还制作了一个小样本project

有人知道解决这个问题的方法吗?

我想我找到了解决办法。您应该使用 Renderer class 而不是使用 RendererDelegate。例如

private class MyColumnRenderer : BrightIdeasSoftware.BaseRenderer
{
      public override bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object x)
      {
          //do you own stuff here

          //default rendering
          return base.RenderSubItem(e, g, cellBounds, x);
      }
}

//...

olvColumn2.Renderer = new MyColumnRenderer();