如何修复 ListView 中的控件重影问题?
How do I fix control ghosting issue in ListView?
我有一个ListView控件,我想在ListView的左上角添加一个复选框。
我使用的添加CheckBox控件的解决方案是这样的:
Me.ListViewCustom1.Controls.Add(CheckBoxControl);
Me.CheckBoxControl.Location = new Point(3, 5);
我遇到的问题与 ListView 滚动有关。复选框似乎都被弄脏了。我一直在网上寻找解决方案,但我真的找不到可以解决这个问题的东西。
控件是这样显示的:
在这种复杂的情况下,我特此请求帮助。
假设您不想要我在 linked post 中使用的选项,另一种方法是将 CheckBox
添加到 header ListView
.
使用 SendMessageYou can send LVM_GETHEADER message to the listview control and get the handle of the header, then SetParent 将帮助您将 header 设置为复选框的 parent:
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);
}
这就是你得到的:
显然,我在 header 列的文本之前添加了一些额外的空格,以便为复选框腾出空间。
我有一个ListView控件,我想在ListView的左上角添加一个复选框。
我使用的添加CheckBox控件的解决方案是这样的:
Me.ListViewCustom1.Controls.Add(CheckBoxControl);
Me.CheckBoxControl.Location = new Point(3, 5);
我遇到的问题与 ListView 滚动有关。复选框似乎都被弄脏了。我一直在网上寻找解决方案,但我真的找不到可以解决这个问题的东西。
控件是这样显示的:
在这种复杂的情况下,我特此请求帮助。
假设您不想要我在 linked post 中使用的选项,另一种方法是将 CheckBox
添加到 header ListView
.
使用 SendMessageYou can send LVM_GETHEADER message to the listview control and get the handle of the header, then SetParent 将帮助您将 header 设置为复选框的 parent:
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);
}
这就是你得到的:
显然,我在 header 列的文本之前添加了一些额外的空格,以便为复选框腾出空间。