【问题标题】:Listview background drawing problem C# WinformListview背景绘制问题 C# Winform
【发布时间】:2008-09-13 03:12:48
【问题描述】:

我的 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();
    }
}

【问题讨论】:

    标签: c# winforms listview


    【解决方案1】:

    啊!我现在看到了:}

    你想要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 的背景图片;)

    【讨论】:

    • 我想要优雅,但我当然可以接受 hacky。我今天会尝试一下,看看它是否有效,这看起来很有希望。
    • 哈克,谢谢!坚持使用具有新世界要求的 listview 和 .net 2.0。
    【解决方案2】:

    (在编辑之前...)

    我刚刚尝试在 System.Windows.Forms.ListView 上设置 BackColor,颜色可以很好地应用于控件(有和没有图像)。

    你在做任何自定义绘画吗?

    【讨论】:

    • 抱歉,我在清理代码之前提出了这个问题。颜色被应用于 ListViewItem 背景而不是 ListView。我会在一秒钟内发布一个示例。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        相关资源
        最近更新 更多