A partir de la versión 6.0 de la librería Common Controls (Comctl32.dll), el listview permite, en la vista 'detalles', agrupar los elementos.
Afortunadamente, si la versión de Comctl32.dll disponible es anterior a la 6.0 e intentamos agrupar los elementos, no se produce ningún error, simplemente se ignora.
Estoy diseñando un formulario para administrar los informes que tiene instalados mi aplicación y uso esta característica para separar los informes que hacen referencia a Empleados, Clientes, etc. El problema es que en Windows 2000, que usa la versión 5.0 de Comctl32.dll, la lista aparece obviamente, sin agrupar.
La solución que se me ha ocurrido es añadir en este caso una columna con el nombre del grupo. Esta columna sólo se añadirá si la capacidad de agrupar no está disponible.
A continuación incluyo el código de una función que devuelve si esta característica está disponible o no.
[DllImport("shell32.dll")]
static extern int DllGetVersion(ref DLLVERSIONINFO2 pdvi);
[StructLayout(LayoutKind.Sequential)]
struct DLLVERSIONINFO
{
public int cbSize;
public int dwMajorVersion;
public int dwMinorVersion;
public int dwBuildNumber;
public int dwPlatformID;
}
[StructLayout(LayoutKind.Sequential)]
struct DLLVERSIONINFO2
{
public DLLVERSIONINFO info1;
public int dwFlags;
public int ullVersion;
}
private static bool? listViewGroupsAvailable = null;
public static bool AreListViewGroupsAvailable()
{
if (listViewGroupsAvailable == null)
{
DLLVERSIONINFO2 versionInfo = new HelperClass.DLLVERSIONINFO2();
versionInfo.info1.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(versionInfo.info1);
if (DllGetVersion(ref versionInfo) == 0)
{
if (versionInfo.info1.dwMajorVersion < 6)
listViewGroupsAvailable = false;
else
listViewGroupsAvailable = true;
}
else
{
// TODO: Log that DllGetVersion fails
listViewGroupsAvailable = false;
}
}
return (bool)listViewGroupsAvailable;
}