2008-12-01 2 views
3

Я хочу создать пользовательскую веб-часть, которая содержит более одной веб-части фильтра и которая может быть подключена к веб-части Report Viewer (Integrated Mode) во время выполнения/времени разработки.Веб-часть пользовательского фильтра Sharepoint

Я много искал для этого, но не смог найти способ иметь одну веб-часть, которая является поставщиком более чем для 1 фильтра.

Скажем, например -

1. My Report accepts 2 parameter Department and Region.  
2. I want to connect both parameters with single web part having two drop down (one for Department and one for Region) 
3. Values from both the drop down should be passed to Department and Region 
4. Report should be rendered in Report Viewer Web Part 

Решение Пробовал до сих пор

1. Create a web part that adds two custom drop down 
2. Custom Drop down class that Implements from ITransformableFilterValues 
3. Have 2 Methods on the web pat each having ConnectionProvider Attribute and return instance of drop down control 

Проблема: вариант подключения

Даже если 2 показан на мой пользовательский фильтр веб-части только можно добавить Например: если я подключу Filter1 (пользовательская веб-часть) к отделу n Я не могу снова подключить его к веб-части Report Viewer.

Мой веб-часть есть методы, как это:

[ConnectionProvider("Departmet", "UniqueIDForDept", AllowsMultipleConnections = true)]  
  public ITransformableFilterValues ReturnCity()  
  {  
    return dropDownDepartment; // It implemets ITransformableFilterValues  
  }  

  [ConnectionProvider("Region", "UniqueIDForRegion", AllowsMultipleConnections = true)]  
  public ITransformableFilterValues ReturnMyRegionB()  
  {  
       return dropDownRegion; //It implemets ITransformableFilterValues  
  } 

ответ

0

я сделал что-то подобное. Это может помочь вам в правильном направлении. Я использовал данные в библиотеке форм для создания подробного отчета. Я использовал службы отчетов и подключался к sharepoint с помощью веб-сервисов. http://server/_vti_bin/Lists.asmx. Параметр отчета, который я использовал, был идентификатором элемента или идентификатором GUID. Затем я настроил средство просмотра отчетов. В библиотеке форм я использовал JavaScript для переопределения контекстного меню, чтобы добавить «Просмотр отчета». На странице отчета я использовал фильтр Query String для захвата идентификатора элемента из URL-адреса.

0

Не уверен, что если бы вы были в состоянии решить вашу проблему ..

На самом деле я попытался с AllowsMultipleConnections = true и он работал отлично:

using System; 
using System.Runtime.InteropServices; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Serialization; 

using Microsoft.SharePoint; 


using aspnetwebparts = System.Web.UI.WebControls.WebParts; 
using Microsoft.Office.Server.Utilities; 
using wsswebparts = Microsoft.SharePoint.WebPartPages; 
using Microsoft.SharePoint.Portal.WebControls; 
using System.Collections.ObjectModel; 
using System.Collections.Generic; 
using Microsoft.SharePoint.Utilities; 

namespace FromMultiSource 
{ 
    [Guid("a0d068dd-9475-4055-a219-88513e173502")] 
    public class MultiSource : aspnetwebparts.WebPart 
    { 
     List<wsswebparts.IFilterValues> providers = new List<wsswebparts.IFilterValues>(); 
     public MultiSource() 
     { 
     } 

     [aspnetwebparts.ConnectionConsumer("Multiple Source Consumer", "IFilterValues", AllowsMultipleConnections = true)] 
     public void SetConnectionInterface(wsswebparts.IFilterValues provider) 
     { 
      this.providers.Add(provider); 
      if (provider != null) 
      { 
       List<wsswebparts.ConsumerParameter> l = new List<wsswebparts.ConsumerParameter>(); 
       l.Add (new wsswebparts.ConsumerParameter ("Value", wsswebparts.ConsumerParameterCapabilities.SupportsMultipleValues | Microsoft.SharePoint.WebPartPages.ConsumerParameterCapabilities.SupportsAllValue)); 
       provider.SetConsumerParameters(new ReadOnlyCollection<wsswebparts.ConsumerParameter>(l)); 
      } 
     } 

     protected override void CreateChildControls() 
     { 
      base.CreateChildControls(); 

      // TODO: add custom rendering code here. 
      // Label label = new Label(); 
      // label.Text = "Hello World"; 
      // this.Controls.Add(label); 
     } 

     protected override void RenderContents(HtmlTextWriter writer) 
     { 
      base.RenderContents(writer); 
      this.EnsureChildControls(); 
      foreach (wsswebparts.IFilterValues provider in this.providers) 
      { 
       if (provider != null) 
       { 
        string prop = provider.ParameterName; 
        ReadOnlyCollection<string> values = provider.ParameterValues; 
        if (prop != null && values != null) 
        { 
         writer.Write("<div>" + SPEncode.HtmlEncode(prop) + ":</div>"); 
         foreach (string v in values) 
         { 
          if (v == null) 
          { 
           writer.Write("<div>&nbsp;&nbsp;<i>&quot;(empty)&quot;/null</i></div>"); 
          } 
          else if (v.Length == 0) 
          { 
           writer.Write("<div>&nbsp;&nbsp;<i>empty string</i></div>"); 
          } 
          else 
          { 
           writer.Write("<div>&nbsp;&nbsp;" + v + "</div>"); 
          } 
         } 
        } 
        else 
        { 
         writer.Write("<div>No filter specified (all).</div>"); 
        } 

       } 
       else 
       { 
        writer.Write("<div>Not connected.</div>"); 
       } 

       writer.Write("<hr>"); 
      } 
     } 
    } 
}