C#实现listview Group收缩扩展的方法

 更新时间:2016年03月03日 09:27:56   作者:Microblue  
这篇文章主要介绍了C#实现listview Group收缩扩展的方法,结合实例形式分析了listview控件的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#实现listview Group收缩扩展的方法。分享给大家供大家参考,具体如下:

1、本实例是完善了codeprofect上面charju老师“Add Group Collapse Behavior on a Listview Control”的一个限制(点击分组后面的图标不能收缩和扩展);

2、本实列适用于win2008,vista;

3、仅供参考,如有更好的方法,望大家不吝交流~

完整代码如下(只需建一个windows工程,在窗体上拖一个listview控件,取名为aoc,右击编辑代码,把下面的代码粘到窗口就可以了~,但需要注意事件对应):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ListViewGroup
{
  public partial class MainForm : Form
  {
    public MainForm()
    {
      InitializeComponent();
    }
    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr window, int message, int wParam, ref LVHITTESTINFO lParam);
    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr window, int message, int wParam, IntPtr lParam);
    private void btCollapse_Click(object sender, EventArgs e)
    {
      SetGroupCollapse(GroupState.COLLAPSED | GroupState.COLLAPSIBLE);
    }
    private void btExpand_Click(object sender, EventArgs e)
    {
      SetGroupCollapse(GroupState.EXPANDED | GroupState.COLLAPSIBLE);
    }
    private void SetGroupCollapse(GroupState state)
    {
      for (int i = 0; i <= aoc.Groups.Count; i++)
      {
        LVGROUP group = new LVGROUP();
        group.cbSize = Marshal.SizeOf(group);
        group.state = (int)state; // LVGS_COLLAPSIBLE 
        group.mask = 4; // LVGF_STATE 
        group.iGroupId = i;
        IntPtr ip = IntPtr.Zero;
        try
        {
          ip = Marshal.AllocHGlobal(group.cbSize);
          Marshal.StructureToPtr(group, ip, true);
          SendMessage(aoc.Handle, 0x1000 + 147, i, ip); // #define LVM_SETGROUPINFO (LVM_FIRST + 147) 
        }
        catch (Exception ex)
        {
          System.Diagnostics.Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
        }
        finally
        {
          if (null != ip) Marshal.FreeHGlobal(ip);
        }
      }
    }
    private void MainForm_Load(object sender, EventArgs e)
    {
      SetGroupCollapse(GroupState.COLLAPSIBLE);
      for (int i = 0; i < aoc.Groups.Count; i++)
      {
        aoc.Groups[i].Tag = "EXPANDED";
      }
    }
    private void aoc_MouseDown(object sender, MouseEventArgs e)
    {
      LVHITTESTINFO lvHitInfo = new LVHITTESTINFO();
      Point p = new Point(e.X, e.Y);
      lvHitInfo.pt = p;
      try
      {
        int id = SendMessage(aoc.Handle, 0x1000 + 18, -1, ref lvHitInfo);
        if (lvHitInfo.flags == 0x50000000)
        {
          if (aoc.Groups[id].Tag.ToString() =="EXPANDED")
          {
            SetGroupCollapseEx(id, GroupState.COLLAPSED | GroupState.COLLAPSIBLE);
            aoc.Groups[id].Tag = "COLLAPSED";
          }
          else if ( aoc.Groups[id].Tag.ToString() == "COLLAPSED")
          {
            SetGroupCollapseEx(id, GroupState.EXPANDED | GroupState.COLLAPSIBLE);
            aoc.Groups[id].Tag = "EXPANDED";
          }
        }
        //MessageBox.Show(string.Format("RESULT={0}   FLAGS=0x{1:X}", id, lvHitInfo.flags));
      }
      catch (Exception ex)
      {
        Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
      }
      finally
      {
        ;
      }
    }
    private void SetGroupCollapseEx(int id, GroupState groupState)
    {
      int i = id;
      LVGROUP group = new LVGROUP();
      group.cbSize = Marshal.SizeOf(group);
      group.state = (int)groupState; // LVGS_COLLAPSIBLE 
      group.mask = 4; // LVGF_STATE 
      group.iGroupId = i;
      IntPtr ip = IntPtr.Zero;
      try
      {
        ip = Marshal.AllocHGlobal(group.cbSize);
        Marshal.StructureToPtr(group, ip, true);
        SendMessage(aoc.Handle, 0x1000 + 147, i, ip); // #define LVM_SETGROUPINFO (LVM_FIRST + 147) 
      }
      catch (Exception ex)
      {
        System.Diagnostics.Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
      }
      finally
      {
        if (null != ip) Marshal.FreeHGlobal(ip);
      }
    }
  }
  [StructLayout(LayoutKind.Sequential)]
  public struct LVGROUP
  {
    public int cbSize;
    public int mask;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszHeader;
    public int cchHeader;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pszFooter;
    public int cchFooter;
    public int iGroupId;
    public int stateMask;
    public int state;
    public int uAlign;
  }
  public enum GroupState
  {
    COLLAPSIBLE = 8,
    COLLAPSED = 1,
    EXPANDED = 0
  }
  [StructLayout(LayoutKind.Sequential)]
  public struct LVHITTESTINFO
  {
    public Point pt;
    public int flags;
    public int iItem;
    public int iSubItem;
    public int iGroup;
  }
}

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • Unity实现倒计时功能

    Unity实现倒计时功能

    这篇文章主要为大家详细介绍了Unity实现倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 浅谈关于C#的垃圾回收机制

    浅谈关于C#的垃圾回收机制

    浅谈关于C#的垃圾回收机制,需要的朋友可以参考一下
    2013-03-03
  • C#实现windows form限制文本框输入的方法

    C#实现windows form限制文本框输入的方法

    这篇文章主要介绍了C#实现windows form限制文本框输入的方法,涉及C#限制文本框输入的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#如何连接使用Zookeeper

    C#如何连接使用Zookeeper

    Zookeeper作为分布式的服务框架,虽然是java写的,但是强大的C#也可以连接使用。而现在主要有两个插件可供使用,分别是ZooKeeperNetEx和Zookeeper.Net,个人推荐使用ZooKeeperNetEx做开发,本文也已介绍ZooKeeperNetEx为主
    2021-06-06
  • protobuf对象二进制序列化存储(详解)

    protobuf对象二进制序列化存储(详解)

    下面小编就为大家带来一篇protobuf对象二进制序列化存储(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C# 三种序列化方法分享

    C# 三种序列化方法分享

    这篇文章主要介绍了C# 三种序列化方法,需要的朋友可以参考下
    2014-02-02
  • C#中ArrayList的使用方法

    C#中ArrayList的使用方法

    这篇文章主要介绍了
    2013-12-12
  • Unity实现角色受击身体边缘发光特效

    Unity实现角色受击身体边缘发光特效

    这篇文章主要为大家详细介绍了Unity实现角色受击身体边缘发光特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#滑动验证码拼图验证功能实现(SlideCaptcha)

    C#滑动验证码拼图验证功能实现(SlideCaptcha)

    目前网站上的验证码机制可谓是五花八门,有简单的数字验证,有掺杂了字母和文字的混淆验证,还有通过滑块进行的拼图验证,下面这篇文章主要给大家介绍了关于C#滑动验证码拼图验证功能的实现方法,需要的朋友可以参考下
    2022-04-04
  • C#强制类型转换小结

    C#强制类型转换小结

    任何一门编程语言均有相关数据类型。C#也不例外,不过转换过程要注意小类型能转换成大类型,但大类型一般不能转换成小类型,下面小编给大家详解C#强制类型转换小结,需要的朋友参考下吧
    2017-07-07

最新评论