如何修复 ListView 中的控件重影问题?

问题描述

我有一个 ListView 控件,我想在 ListView 的左上角添加一个复选框。

添加我正在使用的 CheckBox 控件的解决方案是:

Me.ListViewCustom1.Controls.Add(CheckBoxControl);
Me.CheckBoxControl.Location = new Point(3,5);

我遇到的问题是关于 ListView 滚动。复选框出现全部涂抹。我一直在网上寻找解决方案,但我真的找不到可以解决这个问题的方法

这是控件的显示方式:

Image(Sorry for random data)

在这种复杂的情况下,我在此寻求帮助。

解决方法

假设您不想要我在 linked post 中使用的选项,另一种解决方法是将 CheckBox 添加到 ListView 的标题中。

使用SendMessage您可以向listview控件发送LVM_GETHEADER消息并获取标题的句柄,然后SetParent将帮助您将标题设置为复选框的父级:>

const int LVM_GETHEADER = 0x1000 + 31;
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd,int Msg,IntPtr wParam,IntPtr lParam);
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndNewParent);
private void Form1_Load(object sender,EventArgs e)
{
    var header = SendMessage(listView1.Handle,LVM_GETHEADER,IntPtr.Zero,IntPtr.Zero);
    var checkBox = new CheckBox()
    {
        AutoSize = true,Text = "",Location = new Point(3,5)
    };
    this.listView1.Controls.Add(checkBox);
    SetParent(checkBox.Handle,header);
}

这就是你得到的:

enter image description here

显然,我在列标题的文本前添加了一些额外的空格,以便为复选框腾出空间。