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

C# 如何修复ListView中的控件重影问题?,c#,vb.net,winforms,listview,windows-forms-designer,C#,Vb.net,Winforms,Listview,Windows Forms Designer,我有一个ListView控件,我想在ListView的左上角添加一个复选框 添加我正在使用的复选框控件的解决方案如下: Me.ListViewCustom1.Controls.Add(CheckBoxControl); Me.CheckBoxControl.Location = new Point(3, 5); 我遇到的问题是ListView滚动。该复选框显示为全部涂抹。我一直在网上搜寻解决方案,但我真的找不到解决这个问题的方法 以下是控件的显示方式: 在这种复杂的情况下,我在此请求帮助。假

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

添加我正在使用的复选框控件的解决方案如下:

Me.ListViewCustom1.Controls.Add(CheckBoxControl);
Me.CheckBoxControl.Location = new Point(3, 5);
我遇到的问题是ListView滚动。该复选框显示为全部涂抹。我一直在网上搜寻解决方案,但我真的找不到解决这个问题的方法

以下是控件的显示方式:


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

假设您不想要我在中使用的选项,另一种方法是将
复选框添加到
列表视图的标题中

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

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);
}
这就是你得到的:


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

我确实看到了那篇文章。为复选框添加一个专用列的想法很聪明,但我想在没有新列的情况下解决这个问题。你认为有可能吗?在捕获滚动事件时;那么也许刷新一下会有所帮助..这个解决方案我也遇到了问题。因为我设置的位置不在“列”后面。刷新后,复选框显示在与第一列不相关的位置:/这看起来很有希望!我会尽快看一看,然后我会把你的答案标记为正确答案。谢谢:)我已经测试了答案。复选框出现,但将鼠标悬停在第一列后立即隐藏。@PashaZakharuk它在我的测试中正常工作。你可能把自己的解决方案和这篇文章混在一起了。看看更新的屏幕截图,你说得对。我认为你的答案是正确的。我已经创建了一个全新的控制,它的工作非常完美!非常感谢。酷!我的荣幸:)