如何在c#Winform App中向列表视图列标题添加复选框?

如何在c#Winform App中向列表视图列标题添加复选框?,c#,winforms,listview,checkbox,C#,Winforms,Listview,Checkbox,我想在标题中添加复选框,如果我选中了标题复选框,它应该像全选和全选一样。。。就像上面的图片 我想用c#中的复选框创建这种类型的listview标题。您可以将listview的属性设置为true,并在第一列标题上绘制ChceckBox,然后处理列单击执行全选/取消全选 要绘制列表视图,需要处理DrawColumnHeader、DrawItem和DrawSubItem事件 在DrawColumnHeader事件中绘制复选框 设置e.DrawDefault=true 处理column单击事件并将列

我想在标题中添加复选框,如果我选中了标题复选框,它应该像全选和全选一样。。。就像上面的图片

我想用c#

中的复选框创建这种类型的listview标题。您可以将
listview
的属性设置为true,并在第一列标题上绘制
ChceckBox
,然后处理
列单击
执行全选/取消全选

  • 要绘制
    列表视图
    ,需要处理
    DrawColumnHeader
    DrawItem
    DrawSubItem
    事件

  • DrawColumnHeader
    事件中绘制复选框

  • 设置
    e.DrawDefault=true
  • 处理
    column单击
    事件并将列标题的选中状态存储在列的标记中。同样对于列表视图的每个项目,设置
    Checked
    属性以执行全选/取消全选
代码:

private void listView1_DrawColumnHeader(object sender, 
                                        DrawListViewColumnHeaderEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        e.DrawBackground();
        bool value = false;
        try
        {
            value = Convert.ToBoolean(e.Header.Tag);
        }
        catch (Exception)
        {
        }
        CheckBoxRenderer.DrawCheckBox(e.Graphics, 
            new Point(e.Bounds.Left + 4, e.Bounds.Top + 4),
            value ? System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal :
            System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
    }
    else
    {
        e.DrawDefault = true;
    }
}

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if (e.Column == 0)
    {
        bool value = false;
        try
        {
            value = Convert.ToBoolean(this.listView1.Columns[e.Column].Tag);
        }
        catch (Exception)
        {
        }
        this.listView1.Columns[e.Column].Tag = !value;
        foreach (ListViewItem item in this.listView1.Items)
            item.Checked = !value;

        this.listView1.Invalidate();
    }
}
屏幕截图:

private void listView1_DrawColumnHeader(object sender, 
                                        DrawListViewColumnHeaderEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        e.DrawBackground();
        bool value = false;
        try
        {
            value = Convert.ToBoolean(e.Header.Tag);
        }
        catch (Exception)
        {
        }
        CheckBoxRenderer.DrawCheckBox(e.Graphics, 
            new Point(e.Bounds.Left + 4, e.Bounds.Top + 4),
            value ? System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal :
            System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
    }
    else
    {
        e.DrawDefault = true;
    }
}

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if (e.Column == 0)
    {
        bool value = false;
        try
        {
            value = Convert.ToBoolean(this.listView1.Columns[e.Column].Tag);
        }
        catch (Exception)
        {
        }
        this.listView1.Columns[e.Column].Tag = !value;
        foreach (ListViewItem item in this.listView1.Items)
            item.Checked = !value;

        this.listView1.Invalidate();
    }
}

  • 在上图中,我有3列
  • 我为第一列设置了空文本
  • 我将
    列表视图的
    复选框
    属性设置为true
  • 我为项目设置了空文本,并为每个项目添加了2个子项目

你看到了吗?@Robotnik看上面的图片,我想在列表视图标题中添加复选框。你可以将
listview
OwnerDraw
属性设置为true,并在第一列标题和句柄
column上绘制一个
ChceckBox
来执行全选/取消全选。@SantoshKokatnur你本可以给出一些提示在你的代码项目文章中感谢Reza Aghaei@Dom84已在codeproject中为Reza提供了信贷。看一看。