Turn on more accessible mode
Skip Ribbon Commands
Skip to main content
Turn on Animations

WebPart conectada con multiples interfaces

WebParts


Normalmente una WebPart puede conectarse como Proveedor o como Consumidor. Pero también es posible hacer una WebPart que es a la vez las dos cosas.
Autor: Gustavo

La idea básica es como hacer que las interfaces "ICellProvider" e "ICellConsumer" puedan ser definidas juntas en una misma clase, junto con el evento "CellReady" que es común a las dos interfaces.

Primero hay que inicializar y definir los eventos:

   public event CellConsumerInitEventHandler CellConsumerInit;
   public event CellProviderInitEventHandler CellProviderInit;
   public event CellReadyEventHandler CellReady;

   void ICellProvider.CellConsumerInit(Object sender, CellConsumerInitEventArgs e)
   {
     //Iniciar el Proveedor
     this.WebPartEsProveedor = true;
   }

   void ICellConsumer.CellProviderInit(Object sender, CellProviderInitEventArgs e)
   {
     //Iniciar el Consumidor
     this.WebPartEsConsumidor = true;
   }

   void ICellConsumer.CellReady(Object sender, CellReadyEventArgs e)
   {
     //Estamos listos para hacer algo
   }

El método EnsureInterfaces registra las interfaces con sus propiedades:

   public override void EnsureInterfaces()
   {
     try
     {
       RegisterInterface("Celula Proveedora", InterfaceTypes.ICellProvider, UnlimitedConnections,
         ConnectionRunAt.Server, this, "cellprovider_WPQ_",
         "Provee datos a:", "Provee algo", true);

       RegisterInterface("Celula Consumidora", InterfaceTypes.ICellConsumer, UnlimitedConnections,
         ConnectionRunAt.Server, this, "cellconsumer_WPQ_",
         "Recibe datos de:", "Recibe algo", true);
     }
     catch(System.Security.SecurityException)
     {
       this.strMensaje = "Las interfaces no se han registrado. Revise las restricciones de acceso";
     }
   }

Y los métodos "PartCommunicationConnect" , "PartCommunicationInit" y "PartCommunicationMain" se encargan de la comunicación entre las WebParts

   public override void PartCommunicationInit()
   {
     if(CellProviderInit != null)
     {
       CellProviderInitEventArgs cellProviderInitEventArgs = new CellProviderInitEventArgs();
       //Aqui se puede hacer algo para inicial el Proveedor
       //cellProviderInitEventArgs.FieldDisplayName = "MiFieldDisplayName";
       //cellProviderInitEventArgs.FieldName = "MiFieldName";

       CellProviderInit(this, cellProviderInitEventArgs);
     }

     if(CellConsumerInit != null)
     {
       CellConsumerInitEventArgs cellConsumerInitEventArgs = new CellConsumerInitEventArgs();
       //Aqui se puede hacer algo para inicial el Consumidor
       //cellConsumerInitEventArgs.FieldDisplayName = "MiFieldDisplyName";
       //cellConsumerInitEventArgs.FieldName = "MiFieldName";
       CellConsumerInit(this, cellConsumerInitEventArgs);
     }
   }

   public override void PartCommunicationMain()
   {
     if(CellReady != null && this.BuscoUnaConexion == true)
     {
       CellReadyEventArgs cellReadyEventArgs = new CellReadyEventArgs();
       cellReadyEventArgs.Cell = this.strMensaje; //Envia informacion a la inicializacion

       CellReady(this, cellReadyEventArgs);
     }
   }

   public override void PartCommunicationConnect(string interfaceName, WebPart connectedPart,
     string NombreInterfaceConectada, ConnectionRunAt runAt)
   {
     this.TengoUnaConexion = true; //Tenemos una coneccion!
   }

El ejemplo no discrimina entre quien es el Consumidor y quien es su Proveedor, por lo que el texto "strMensaje" es mostrado en todas las instancias que se utilicen en una pagina.

En la interfase para conectar la WebPart aparecen desde ahora dos opciones: "Provee datos a:" y "Recibe datos de:"

Aqui puede encontrar el codigo de la WebPart