C#實(shí)現(xiàn)listview Group收縮擴(kuò)展的方法
本文實(shí)例講述了C#實(shí)現(xiàn)listview Group收縮擴(kuò)展的方法。分享給大家供大家參考,具體如下:
1、本實(shí)例是完善了codeprofect上面charju老師“Add Group Collapse Behavior on a Listview Control”的一個(gè)限制(點(diǎn)擊分組后面的圖標(biāo)不能收縮和擴(kuò)展);
2、本實(shí)列適用于win2008,vista;
3、僅供參考,如有更好的方法,望大家不吝交流~
完整代碼如下(只需建一個(gè)windows工程,在窗體上拖一個(gè)listview控件,取名為aoc,右擊編輯代碼,把下面的代碼粘到窗口就可以了~,但需要注意事件對(duì)應(yīng)):
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;
}
}
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見(jiàn)控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
- c# winform treelistview的使用(treegridview)實(shí)例詳解
- C#中WPF ListView綁定數(shù)據(jù)的實(shí)例詳解
- C# WPF ListView控件的實(shí)例詳解
- C# ListView 點(diǎn)擊表頭對(duì)數(shù)據(jù)進(jìn)行排序功能的實(shí)現(xiàn)代碼
- C#實(shí)現(xiàn)在listview中插入圖片實(shí)例代碼
- C#中ListView控件實(shí)現(xiàn)窗體代碼
- C#下listview如何插入圖片
- C#實(shí)現(xiàn)帶進(jìn)度條的ListView
- C#實(shí)現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法
- 一文掌握C# ListView控件的用法和示例代碼
相關(guān)文章
c#一個(gè)定時(shí)重啟的小程序?qū)崿F(xiàn)代碼
今天有個(gè)朋友找我問(wèn)有沒(méi)有一些能像Windows一樣計(jì)劃任務(wù)重啟的軟件,我也不清楚。他它說(shuō)能讓我做一個(gè)給他它么?我考慮了一下,他的服務(wù)器都是有安裝.NET框架的,那可以用.NET來(lái)使下~~!2008-09-09
C#實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行字符串腳本(優(yōu)化版)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行字符串腳本(優(yōu)化版),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
Entity?Framework模型優(yōu)先與實(shí)體對(duì)象查詢(xún)
這篇文章介紹了Entity?Framework模型優(yōu)先與實(shí)體對(duì)象查詢(xún),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C#使用Dynamic實(shí)現(xiàn)簡(jiǎn)化反射
這篇文章主要為大家詳細(xì)介紹了C#如何使用Dynamic來(lái)實(shí)現(xiàn)簡(jiǎn)化反射,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
C#如何讀寫(xiě)應(yīng)用程序配置文件App.exe.config,并在界面上顯示
這篇文章主要介紹了C#如何讀寫(xiě)應(yīng)用程序配置文件App.exe.config,并在界面上顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
C#網(wǎng)絡(luò)請(qǐng)求與JSON解析的示例代碼
這篇文章主要介紹了C#網(wǎng)絡(luò)請(qǐng)求與JSON解析的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
C#連接SQL數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)功能的操作技巧
本文給大家分享C#連接SQL數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)功能的操作技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-05-05

