Listview背景绘制问题 C# Winform

3
我在使用Listview时遇到了一点小问题。
虽然我可以成功地加载listview项,但当我设置背景颜色时,它并没有将颜色绘制到行的左侧 [listViewItems通过ListViewSubItems加载以创建网格视图,只有第一列显示错误]。会有一个狭窄的条纹没有被绘制。那个条纹的宽度与如果我有一个行标题,行标题的宽度大致相同。
如果你有任何想法可以让背景颜色绘制出来,我很想听听。
现在,为了尝试一个新的想法,我提供了10票的奖励,给第一个解决方案,仍然让我使用这个可怕的伪网格视图的混乱结构。[我喜欢旧代码。]
编辑:
以下是展示问题的示例。
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ListView lv = new ListView();

        lv.Dock = System.Windows.Forms.DockStyle.Fill;
        lv.FullRowSelect = true;
        lv.GridLines = true;
        lv.HideSelection = false;
        lv.Location = new System.Drawing.Point(0, 0);
        lv.TabIndex = 0;
        lv.View = System.Windows.Forms.View.Details;
        lv.AllowColumnReorder = true;

        this.Controls.Add(lv);

        lv.MultiSelect = true;

        ColumnHeader ch = new ColumnHeader();
        ch.Name = "Foo";
        ch.Text = "Foo";
        ch.Width = 40;
        ch.TextAlign = HorizontalAlignment.Left;

        lv.Columns.Add(ch);

        ColumnHeader ch2 = new ColumnHeader();
        ch.Name = "Bar";
        ch.Text = "Bar";
        ch.Width = 40;
        ch.TextAlign = HorizontalAlignment.Left;

        lv.Columns.Add(ch2);

        lv.BeginUpdate();

        for (int i = 0; i < 3; i++)
        {


            ListViewItem lvi = new ListViewItem("1", "2");

            lvi.BackColor = Color.Black;
            lvi.ForeColor = Color.White;

            lv.Items.Add(lvi);
        }
        lv.EndUpdate();
    }
}
4个回答

5
啊!我现在明白了 :}
你想要一些hacky的东西?我向你介绍以下内容:
    ...
    lv.OwnerDraw = true;
    lv.DrawItem += new DrawListViewItemEventHandler( lv_DrawItem );
    ...

void lv_DrawItem( object sender, DrawListViewItemEventArgs e )
{
    Rectangle foo = e.Bounds;
    foo.Offset( -10, 0 );
    e.Graphics.FillRectangle( new SolidBrush( e.Item.BackColor ), foo );
    e.DrawDefault = true;
}

如果您希望更具创意且同样巧妙的方法,您可以尝试利用ListView的背景图像 ;)


我想要优雅的代码,但当然我也可以接受一些不太规范的。我今天会尝试一下看看它是否可行,这看起来非常有前途。 - Dan Blair
有点hacky,谢谢!被listview和.net 2.0以及新的需求困住了。 - kyle

1

在编辑之前...

我刚刚尝试设置 System.Windows.Forms.ListView 的 BackColor,颜色可以很好地应用于整个控件(包括有和没有图像的情况)。

你是否进行了任何自定义绘制?


抱歉,在清理代码之前我已经发布了这个问题。颜色被应用到了 ListViewItem 的背景而不是 ListView。我会马上发布一个示例。 - Dan Blair

0

Better ListView(以及免费的Better ListView Express)允许使用各种对齐设置(居中、平铺、拉伸、适应、贴边/角落)设置背景图像。还支持Alpha透明度:

enter image description here


0

好的,我正在添加一些额外的解决方案注释。如果您使用上面的解决方案,还需要为列标题插入一个绘制处理程序,否则它们不会绘制。所选项目矩形也看起来很奇怪,因此您需要在lv_DrawItem函数中检查并实现类似的解决方案。请记住,突出显示是在系统级别选择的,而不是在您的应用程序中选择的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接