Compartir a través de


Controles de lista virtual

Un control de lista virtual es un control listview que tiene el estilo de LVS_OWNERDATA . Este estilo permite al control admita un recuento de elementos hasta DWORD (el número predeterminado del elemento extiende sólo a int). Sin embargo, la ventaja mayor proporcionada por este estilo es la capacidad sólo de tener un subconjunto de elementos de datos en memoria en cualquier momento. Esto permite al control de la vista de lista virtual se preste para el uso con bases de datos grandes de información, donde ya colocados los métodos específicos de acceso a datos.

Nota

Además de proporcionar la funcionalidad virtual de la lista de CListCtrl, MFC también ofrece la misma funcionalidad en la clase de CListView .

Hay problemas de compatibilidad que debe tener en cuenta al desarrollar controles de lista virtuales. Para obtener más información, vea la sección sobre los problemas de compatibilidad del tema de los Controles de la vista de lista en Windows SDK.

Administrar la notificación de LVN_GETDISPINFO

Los controles de lista virtuales mantener información sobre el elemento muy pequeña. Salvo la selección de elementos y la información de foco, toda la información sobre el elemento es administrada por el propietario del control. La información es solicitada por el marco mediante un mensaje de notificación de LVN_GETDISPINFO . Para proporcionar la información solicitada, el propietario del control de lista virtual (o el propio control) debe controlar esta notificación. Esto se puede facilitar la mediante la ventana Propiedades (vea Asignar mensajes a funciones). El código resultante debería tener una apariencia similar al ejemplo siguiente (donde CMyDialog posee el objeto de control de lista virtual y el diálogo está administrando la notificación):

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)

En el controlador del mensaje de notificación de LVN_GETDISPINFO , debe comprobar lo que se solicita el tipo de información. Los valores posibles son:

  • el miembro deLVIF_TEXTThe pszText debe completarse.

  • el miembro deLVIF_IMAGEThe iImage debe completarse.

  • El miembro  iIndent deLVIF_INDENTThe debe completarse.

  • el miembro  lParam deLVIF_PARAMThe debe completarse. (No presente para los sub- elementos).

  • el miembro  de estado deLVIF_STATEThe debe completarse.

Deberá proporcionar cualquier información se solicita al marco.

El ejemplo siguiente (tomado del cuerpo del controlador de notificación para el objeto de control de lista) muestra un método posible proporcionando la información para los búferes de texto y la imagen de un elemento:

NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem = &(pDispInfo)->item;

int iItem = pItem->iItem;

if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
   switch(pItem->iSubItem)
   {
      case 0: //fill in main text
         _tcscpy_s(pItem->pszText, pItem->cchTextMax,
            m_Items[iItem].m_strItemText);
         break;
      case 1: //fill in sub item 1 text
         _tcscpy_s(pItem->pszText, pItem->cchTextMax,
            m_Items[iItem].m_strSubItem1Text);
         break;
      case 2: //fill in sub item 2 text
         _tcscpy_s(pItem->pszText, pItem->cchTextMax,
            m_Items[iItem].m_strSubItem2Text);
         break;
   }
}

if (pItem->mask & LVIF_IMAGE) //valid image?
{
   pItem->iImage = m_Items[iItem].m_iImage;
}

Controles de lista almacenamiento en caché y de Virtual

Dado que diseñan a este tipo de control list para los conjuntos de datos, se recomienda almacenar en caché datos solicitados de elemento para mejorar el rendimiento de la recuperación. El marco de trabajo proporciona un mecanismo memoria caché- que sugiere que ayuda a optimizar caché enviando un mensaje de notificación de LVN_ODCACHEHINT .

El ejemplo siguiente actualiza la memoria caché con el intervalo pasado a la función de controlador.

void CMyDialog::OnLvnOdcachehintList3(NMHDR *pNMHDR, LRESULT *pResult)
{
   LPNMLVCACHEHINT pCacheHint = reinterpret_cast<LPNMLVCACHEHINT>(pNMHDR);

   // Update the cache with the recommended range. 
   for (int i = pCacheHint->iFrom; i <= pCacheHint->iTo; i++)
   {
      m_Items[i].m_iImage = i % 2;
      m_Items[i].m_strItemText.Format(_T("Item %d"), i);
      m_Items[i].m_strSubItem1Text = _T("Sub 1");
      m_Items[i].m_strSubItem2Text = _T("Sub 2");
   }

   *pResult = 0;
}

Para obtener más información sobre la preparación y mantener de caché, vea la sección administración de la memoria caché del tema de los Controles de la vista de lista en Windows SDK.

Elementos específicos de buscar

El mensaje de notificación de LVN_ODFINDITEM es enviado por el control de lista virtual a un elemento determinado del control de lista necesita encontrar. Se envía el mensaje de notificación cuando el control de vista de lista recibe el acceso de clave rápida o cuando recibe un mensaje de LVM_FINDITEM . La información de búsqueda se envía en forma de estructura de LVFINDINFO , que es un miembro de la estructura de NMLVFINDITEM . Controle este mensaje reemplazando la función de OnChildNotify de objetos y de dentro del control de lista el cuerpo del controlador, compruebe el mensaje de LVN_ODFINDITEM . Si se encuentra, realice la acción adecuada.

Debe estar preparado para buscar un elemento que coincida con la información especificada por el control de vista de lista. Debe devolver el índice del elemento si es correcto, o -1 si no se encuentra ningún elemento coincidente.

Vea también

Referencia

Usar CListCtrl

Conceptos

Controles (MFC)