Listview背景绘图问题C#Winform
时间:2020-03-05 18:52:39 来源:igfitidea点击:
我有一个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(); } }
解决方案
回答
(在编辑之前...)
我刚刚尝试在System.Windows.Forms.ListView上设置BackColor,并且将颜色很好地应用到控件上(带有和不带有图像)。
我们是否正在做任何自定义绘画?
回答
啊!我现在明白了 :}
我们要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的背景图片;)
回答
好的,我要添加一些其他解决方案说明。如果使用上述解决方案,则还需要为列标题插入绘制处理程序,否则它们将无法绘制。所选项目的矩形看起来也很有趣,因此我们需要在lv_DrawItem函数中进行检查并实现类似的解决方案。请记住,突出显示是在系统级别而不是在应用程序中选择的。