Pergunta

Digamos que você tenha vários webparts, um como um controlador e vários que levar informações a partir do controlador e agir sobre ela. Este é bastante fácil de modelo usando a interface do Consumidor / Produtor introduzido em ASP 2.0.

Como você seria capaz de adicionar interações o contrário, embora ainda mantendo o acima?

Um exemplo simples seria: o usuário digita informações em webpart A que executa uma pesquisa e os resultados serão exibidos na Web Part B. Webpart C permite filtrar os resultados que devem acionar webpart A para re-enviar a consulta e portanto, atualizar os resultados no B.

Não parece possível fazer em WSS 3.0, porque você só são permitidos 1 interface para ser usada em todas as conexões a qualquer momento.

Será que isso ainda faz sentido? : -)

Foi útil?

Solução

Uma solução rápida e suja para permitir a comunicação controle arbitrário é usar recursiva controle localizar e eventos. Tenha procurar os controles da árvore de controle por tipo de controle para o que eles precisam e, em seguida, assinar eventos expostos publicamente sobre o controle editorial.

Eu tenho anterior usou o truque para permitir controles de servidor padrão para encontrar um ao outro quando incorporado em sistemas de CMS de diferentes fornecedores para evitar uma API de comunicação específico inteiramente.

Outras dicas

Eu não vejo nada de errado com webpart A obtenção de uma referência a Web Part B e chamando / métodos internos / propriedades públicas ou subscrever manipuladores de eventos públicos / internos. Um ponto de menção ao fazer isso, porém: EnsureChildControls. Eu testemunhei com meus próprios olhos um webpart sendo executado claro para PreRender enquanto outro webpart não tinha sequer correr CreateChildControls.

De webpart A, buscar a sua referência a Web Part B (neste caso webpart B é do tipo Calendário) assim:

     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;
      }
    }

Agora você pode fazer coisas como buscar alguns novos dados e atualizar o calendário assim:

         IEnumerable newData = SomeDataProvider.GetNewData(args);
        CalendarWP.someGridView.DataSource = newData;
        CalendarWP.someGridView.DataBind();

Ou talvez deixe webpart um lance uma referência a si mesmo ao longo de webpart B para que ele possa usar WebPart pública de A / propriedades internas para ir buscar dados por si:

CalendarWP.UseWPAToFetchData(this);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top