Controles ActiveX de MFC: Utilizar enlace de datos en un control ActiveX
Uno de los usos más eficaces de controles ActiveX es el enlace de datos, lo que permite que una propiedad de control enlace con un campo concreto en una base de datos.Cuando un usuario modifica datos en esta propiedad enlazada, el control notifica a la base de datos y las solicitudes que el campo de registro están actualizados.La base de datos a continuación notifica al control de corrección o error de la solicitud.
Este artículo trata el lado del control de la tarea.Implementar las interacciones del enlace de datos con la base de datos es responsabilidad del contenedor del control.Cómo se administran las interacciones de base de datos en el contenedor está fuera del ámbito de esta documentación.Cómo se prepara el control para el enlace de datos se explica en el resto de este artículo.
Diagrama conceptual de un control enlazado a datos
La clase de COleControl proporciona dos funciones miembro que crean enlace de datos un proceso sencillo para implementar.La primera función, BoundPropertyRequestEdit, se utiliza para solicitar permiso para cambiar el valor de propiedad.Se llamaBoundPropertyChanged, la segunda función, después de que el valor de propiedad se ha cambiado correctamente.
En este artículo se tratan los siguientes temas:
Crear una propiedad común enlazable
Creando un enlazable get/set el método
Crear una propiedad común enlazable
Es posible crear una propiedad común enlazada a datos, aunque es más probable que desee enlazable get/set el método.
[!NOTA]
Las propiedades comunes tienen los atributos de bindable y de requestedit de forma predeterminada.
Para agregar una propiedad común enlazable mediante el asistente para agregar propiedades
Inicia un proyecto mediante Asistente para controles ActiveX MFC.
Haga clic con el botón secundario en el nodo de la interfaz para el control.
Esto abre el menú contextual.
En el menú contextual, haga clic agregar y haga clic en Agregar propiedad.
Seleccione una de las entradas de la lista desplegable de propiedadNombre .Por ejemplo, puede seleccionar Texto.
Dado que Texto es una propiedad común, los atributos de bindable y de requestedit se comprueban ya.
Active las casillas siguientes desde la ficha de IDL Attributes : displaybind y defaultbind para agregar atributos a la definición de propiedad del archivo de .IDL del proyecto.Estos atributos hacen que el control visible para el usuario y crea la propiedad común la propiedad enlazable predeterminada.
En este punto, el control puede mostrar datos de un origen de datos, pero el usuario no podrá actualizar los campos de datos.Si desea que el control también para poder actualizar datos, cambiar la función de OnOcmCommandOnOcmCommand para ser la siguiente:
#ifdef _WIN32
WORD wNotifyCode = HIWORD(wParam);
#else
WORD wNotifyCode = HIWORD(lParam);
#endif
if(wNotifyCode==EN_CHANGE)
{
if(!BoundPropertyRequestEdit(DISPID_TEXT))
{
SetNotSupported();
}
else
{
GetText();
// Notify container of change
BoundPropertyChanged(DISPID_TEXT);
}
}
return 0;
Ahora puede compilar el proyecto, que registrará el control.Cuando se inserta el control en un cuadro de diálogo, las propiedades de Data Field y de Origen de datos se habrán agregado y puede seleccionar un origen de datos y un campo para mostrar en el control.
Creando un enlazable get/set el método
Además de enlazado a datos get/set el método, también puede crear propiedad común enlazable.
[!NOTA]
Este procedimiento se supone que tiene un proyecto de control ActiveX que cree subclases un control de Windows.
Para agregar un enlazable obtenga o establezca el método mediante el asistente para agregar propiedades
Cargue el proyecto de control.
En la página de Control Settings , seleccione una clase de ventana para que el control cree subclases.Por ejemplo, quizá desee crear subclases de un control de edición.
Cargue el proyecto de control.
Haga clic con el botón secundario en el nodo de la interfaz para el control.
Esto abre el menú contextual.
En el menú contextual, haga clic agregar y haga clic en Agregar propiedad.
Escriba el nombre de propiedad en el cuadro de Property Name .Utilice MyProp para este ejemplo.
Seleccione un tipo de datos de cuadro de lista desplegable de Property Type .Uso short para este ejemplo.
Para Implementation Type, haga clic en Get/Set Methods.
Active las casillas siguientes de la pestaña de atributos IDL: bindable, requestedit, displaybind, y defaultbind para agregar atributos a la definición de propiedad del archivo de .IDL del proyecto.Estos atributos hacen que el control visible para el usuario y crea la propiedad común la propiedad enlazable predeterminada.
Haga clic en Finalizar.
Modifique el cuerpo de la función de SetMyProp de modo que contenga el código siguiente:
if(!BoundPropertyRequestEdit(1)) { SetNotSupported(); return; } else { if(AmbientUserMode()) // SendMessage only at run-time { _stprintf_s(m_strText.GetBuffer(10), 10, _T("%d"), newVal); SetWindowText(m_strText); m_strText.ReleaseBuffer(); } else { InvalidateControl(); } // Signal a property change // This is the MFC equivalent of OnChanged() BoundPropertyChanged(1); SetModifiedFlag(); }
El parámetro pasado a las funciones de BoundPropertyChanged y de BoundPropertyRequestEdit es el dispid de la propiedad, que es el parámetro que se pasa al atributo id. () de la propiedad en el archivo de .IDL.
Modifique la función de OnOcmCommand lo que contiene el código siguiente:
#ifdef _WIN32 WORD wNotifyCode = HIWORD(wParam); #else WORD wNotifyCode = HIWORD(lParam); #endif if(wNotifyCode==EN_CHANGE) { if(!BoundPropertyRequestEdit(DISPID_TEXT)) { SetNotSupported(); } else { GetText(); // Notify container of change BoundPropertyChanged(DISPID_TEXT); } } return 0;
Modifique la función de OnDraw de modo que contenga el código siguiente:
if(!AmbientUserMode()) { // Draw the Text property at design-time pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->DrawText(m_strText, -1, (LPRECT)&rcBounds, DT_LEFT | DT_TOP | DT_SINGLELINE); } else { DoSuperclassPaint(pdc, rcBounds); }
A la sección pública del archivo de encabezado el archivo de encabezado para su clase de control, agregue las siguientes definiciones (constructores) para las variables miembro:
CString m_strText; short m_nMyNum;
Haga que la siguiente línea la última línea en DoPropExchange funciona:
PX_String(pPX, _T("MyProp"), m_strText);
Modifique la función de OnResetState de modo que contenga el código siguiente:
COleControl::OnResetState(); // Resets defaults found in DoPropExchange m_strText = AmbientDisplayName();
Modifique la función de GetMyProp de modo que contenga el código siguiente:
if(AmbientUserMode()) { GetWindowText(m_strText); m_nMyNum = (short)_ttoi(m_strText); } return m_nMyNum;
Ahora puede compilar el proyecto, que registrará el control.Cuando se inserta el control en un cuadro de diálogo, las propiedades de Data Field y de Origen de datos se habrán agregado y puede seleccionar un origen de datos y un campo para mostrar en el control.
Vea también
Referencia
Controles enlazados a datos (ADO y RDO)