ListView刷新无法正常工作

时间:2016-01-09 19:13:46

标签: c# winforms

编辑:我已经弄清楚为什么文本被绘制为粗体。因为第一列调用OnDrawSubItem两次。谁知道为什么?

我创建了一个继承自ListView类的自定义控件。我已经覆盖了OnDrawSubItem和OnDrawItem方法,如下所示:

    protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
    {
        Rectangle rowBounds = e.SubItem.Bounds;
        Rectangle labelBounds = e.Item.GetBounds(ItemBoundsPortion.Label);
        Rectangle bounds = new Rectangle(rowBounds.Left + 5, rowBounds.Top + 2, labelBounds.Width - 5, rowBounds.Height + 2);
        if (e.Item.Selected)
            e.Graphics.DrawString(e.SubItem.Text, Font, Brushes.White, bounds);
        else
            e.Graphics.DrawString(e.SubItem.Text, Font, Brushes.Black, bounds);

    }

    protected override void OnDrawItem(DrawListViewItemEventArgs e)
    {
        e.DrawBackground();
        if (e.Item.Selected)
        {
            Rectangle rowBounds = e.Bounds;
            Rectangle bounds = new Rectangle(0, rowBounds.Top, rowBounds.Width, rowBounds.Height);
            e.Graphics.FillRectangle(Brushes.Gray, bounds);
        }
    }

但有些东西不能正常工作。当我向ListView添加一些项目时,文本有点厚。列表视图放在一个选项卡中。当我切换到另一个选项卡并返回带有列表视图的选项卡时,文本似乎很好。所以我尝试制作这个并尝试在项目添加操作结束时添加listView.Refresh(),但它不起作用:

//code 1
foreach(string s in new string[] { "item1", "item2", "item3", "item4", "item5" })
{
    listView.Items.Add(s);
}
listView.Refresh();

输出是:

我也尝试在每次迭代时刷新,但它有点好,但最后一个元素没有刷新:

//code 2
foreach(string s in new string[] { "item1", "item2", "item3", "item4", "item5" })
{
    listView.Items.Add(s);
    listView.Refresh();
}

输出:

切换选项卡时,所有文本都应该是这样的。

我的两个问题:

  1. 为什么文本在添加后会变坏?
  2. 代码1和代码2有什么区别?我认为他们应该以同样的方式工作。
  3. 另外,也许值得一提的是,如果我添加第二列,第二列就会很好地呈现。

1 个答案:

答案 0 :(得分:0)

您是否尝试在DrawString之前调用e.DrawBackground()?这可能会摆脱厚厚的文字。