ObjectListView - 仅在鼠标悬停在项目上后才对行进行格式化

ObjectListView - Rows are formatted only after MouseOver on Items

我需要一些帮助或 advice/experience 其他人。 这是我正在努力解决的问题:

在我的项目中,objectlistview olvDifference 用于可视化列表的项目 (Type Conflict)。到目前为止,我能够添加所需的列并正确设置它们的格式。但是

提供的格式
private void ConflictFormatRow(object sender, 
BrightIdeasSoftware.FormatRowEventArgs e)
{
  Conflict conflict = (Conflict)e.Model;
  if (conflict == null) return;
  if (conflict.resolution == ConflictResolution.None) e.Item.BackColor = conflictColor;
  else if (conflict.resolution == ConflictResolution.UseMine) e.Item.BackColor = mineColor;
  else if (conflict.resolution == ConflictResolution.UseTheirs) e.Item.BackColor = theirsColor;
  else e.Item.BackColor = System.Drawing.Color.White;
  if(e.Model == olvConflictList.SelectedObject)
  {
    BrightIdeasSoftware.RowBorderDecoration a = new BrightIdeasSoftware.RowBorderDecoration();
    a.BorderPen.Color = Color.Black;
    a.BorderPen.Width = 3;
    a.CornerRounding = 0;
    a.FillBrush = Brushes.Transparent;
    e.Item.Decoration = a;
  }
  else
  {
    BrightIdeasSoftware.RowBorderDecoration b = new BrightIdeasSoftware.RowBorderDecoration();
    b.BorderPen.Color = Color.Transparent;
    b.BorderPen.Width = 0;
    b.CornerRounding = 0;
    b.FillBrush = Brushes.Transparent;
    e.Item.Decoration = b;
  }
}

在窗体(WFA)的构造函数中,分配AspectGetter并设置要显示的对象。

设计者生成的代码等于以下块:

  // 
  // olvConflictList
  // 
  this.olvConflictList.AllColumns.Add(this.olvcConflictList);
  this.olvConflictList.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
  this.olvConflictList.CellEditUseWholeCell = false;
  this.olvConflictList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
        this.olvcConflictList});
  this.olvConflictList.Cursor = System.Windows.Forms.Cursors.Default;
  this.olvConflictList.FullRowSelect = true;
  this.olvConflictList.Location = new System.Drawing.Point(780, 90);
  this.olvConflictList.Name = "olvConflictList";
  this.olvConflictList.Size = new System.Drawing.Size(286, 489);
  this.olvConflictList.TabIndex = 18;
  this.olvConflictList.UseCellFormatEvents = true;
  this.olvConflictList.UseCompatibleStateImageBehavior = false;
  this.olvConflictList.View = System.Windows.Forms.View.Details;
  this.olvConflictList.FormatRow += new System.EventHandler<BrightIdeasSoftware.FormatRowEventArgs>(this.ConflictFormatRow);
  this.olvConflictList.SelectedIndexChanged += new System.EventHandler(this.olvDifferenceGroups_SelectedIndexChanged);
  // 
  // olvcConflictList
  // 
  this.olvcConflictList.AspectName = "";
  this.olvcConflictList.AutoCompleteEditor = false;
  this.olvcConflictList.AutoCompleteEditorMode = System.Windows.Forms.AutoCompleteMode.None;
  this.olvcConflictList.FillsFreeSpace = true;
  this.olvcConflictList.Groupable = false;
  this.olvcConflictList.HeaderCheckBoxUpdatesRowCheckBoxes = false;
  this.olvcConflictList.Hideable = false;
  this.olvcConflictList.IsEditable = false;
  this.olvcConflictList.MinimumWidth = 50;
  this.olvcConflictList.Searchable = false;
  this.olvcConflictList.Sortable = false;
  this.olvcConflictList.Text = "Conflicts";
  this.olvcConflictList.UseFiltering = false;
  this.olvcConflictList.Width = 283;

olv 中唯一没有 BackGroundColor(白色,默认)的项目:

启动该过程后,如上图所示,但我希望它会像下图一样被初始化(在我第一次用鼠标悬停在它上面之后)。

olv 中唯一的项目具有在 ConflictFormatRow 中指定的背景颜色 conflictColor

我的代码哪里需要改进?有什么建议吗?

好吧,我自己能弄明白。 我查看了 OLV 的来源以及目前发现的内容:

在我的例子中,第一行 "Conflicts" 设置为 "Groupable=False",但 OLV 本身设置为 "ShowGroups=True"。 FormatRow 在 PostProcessOneRow 中触发,根据源代码(版本:2.9.1.0)按以下逻辑调用:

protected virtual void PostProcessRows() {
        // If this method is called during a BeginUpdate/EndUpdate pair, changes to the
        // Items collection are cached. Getting the Count flushes that cache.
#pragma warning disable 168
// ReSharper disable once UnusedVariable
        int count = this.Items.Count;
#pragma warning restore 168

        int i = 0;
        if (this.ShowGroups) {
            foreach (ListViewGroup group in this.Groups) {
                foreach (OLVListItem olvi in group.Items) {
                    this.PostProcessOneRow(olvi.Index, i, olvi);
                    i++;
                }
            }
        } else {
            foreach (OLVListItem olvi in this.Items) {
                this.PostProcessOneRow(olvi.Index, i, olvi);
                i++;
            }
        }
    }

由于分组失败,由于 OLV 中不存在可分组的行,if-body 中的 PostProcessOneRow 甚至一次都没有被命中(foreach 在 "this.Groups" 中运行,其计数为 0)。

设置 "ShowGroups=False",现在效果很好。