Sharepoint WebParts
web-parts webpart-connection (2)
Una solución rápida y sucia para permitir una comunicación de control arbitraria es usar eventos y control de búsqueda recursivo. Haga que los controles busquen en el árbol de control por tipo de control lo que necesitan y luego suscríbase a los eventos públicamente expuestos en el control de publicación.
Anteriormente utilicé el truco para permitir que los controles de servidor estándar se encuentren entre sí cuando están integrados en sistemas CMS de distintos proveedores para evitar por completo una API de comunicación específica.
Supongamos que tiene varias partes web, una como controlador y varias que toman información del controlador y actúan en consecuencia. Esto es bastante fácil de modelar utilizando la interfaz Consumer / Producer presentada en ASP 2.0.
¿Cómo podría agregar interacciones al revés mientras mantiene lo anterior?
Un ejemplo simple sería: el usuario ingresa información en la parte web A que realiza una búsqueda y los resultados se mostrarán en la parte web B. Webpart C le permite filtrar los resultados que deberían desencadenar la parte web A para volver a enviar la consulta y actualizar la resultados en B.
No parece posible hacerlo en WSS 3.0 porque solo se permite el uso de 1 interfaz en todas las conexiones en cualquier momento.
Esto tiene sentido ? :-)
No veo nada de malo en que la parte web A obtenga una referencia a la parte web B y llame a los métodos / propiedades públicos / internos o a los controladores de suscripción a eventos públicos / internos. Un punto de mención al hacer esto es: EnsureChildControls. He sido testigo, con mis propios ojos, de que una parte web se ejecuta sin problemas para PreRender, mientras que otra parte web ni siquiera había ejecutado CreateChildControls.
Desde webpart A, busque su referencia a webpart B (en este caso webpart B es de tipo Calendario) como sigue:
private Calendar _calendarWP = null;
public Calendar CalendarWP
{
get
{
if (_calendarWP != null)
return _calendarWP;
else
foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones)
foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts)
if (webpart is Calendar)
{
_calendarWP = (Calendar)webpart;
_calendarWP.EnsureChildControls();
return _calendarWP;
}
return null;
}
}
Ahora puede hacer cosas como recuperar algunos datos nuevos y actualizar el calendario de la siguiente manera:
IEnumerable newData = SomeDataProvider.GetNewData(args);
CalendarWP.someGridView.DataSource = newData;
CalendarWP.someGridView.DataBind();
O tal vez permita que webpart A envíe una referencia a sí mismo a webpart B para que pueda usar las propiedades públicas / internas de webpart A para ir a buscar datos por sí mismo:
CalendarWP.UseWPAToFetchData(this);