Веб-часть пользовательского фильтра Sharepoint - PullRequest
3 голосов
/ 02 декабря 2008

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

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

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

  1. My Report принимает 2 параметра Department и Region.
  2. Я хочу связать оба параметра с одной веб-частью, имеющей два раскрывающихся списка (один для Department и один для Region)
  3. Значения из выпадающего списка должны быть переданы Department и Region
  4. Report должен отображаться в веб-части средства просмотра отчетов

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

  1. Создание веб-части, которая добавляет два пользовательских раскрывающихся списка
  2. Пользовательский выпадающий класс, который реализуется с ITransformableFilterValues
  3. В веб-патче есть 2 метода, каждый из которых имеет атрибут ConnectionProvider и возвращает экземпляр выпадающего элемента управления

Проблема:

Несмотря на то, что в моей настраиваемой веб-части отображается опция 2 подключения, можно добавить только одну. Например, если я подключаю Filter1 (пользовательскую веб-часть) к Department, то я не могу снова подключить его к 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 
}

Ответы [ 2 ]

0 голосов
/ 07 августа 2009

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

На самом деле я пытался с 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>");
            }
        }
    }
}
0 голосов
/ 04 декабря 2008

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

...