3

複数のフィルター Web パーツを持ち、実行時/設計時にレポート ビューアー Web パーツ (統合モード) に接続できるカスタム Web パーツを作成したいと考えています。

これをよく検索しましたが、複数のフィルターのプロバイダーである単一の Web パーツを持つ方法が見つかりませんでした。

たとえば、

  1. Myは 2 つのパラメータとReportを受け入れます。  DepartmentRegion
  2. Department両方のパラメーターを、2 つのドロップダウン (1 つと 1つRegion)を持つ単一の Web パーツに接続したい
  3. ドロップダウンの両方の値を と に渡す必要がDepartmentあります。Region
  4. Reportレポート ビューアー Web パーツでレンダリングする必要があります

これまでに試した解決策

  1. 2 つのカスタム ドロップダウンを追加する Web パーツを作成する
  2. から実装するカスタム ドロップダウン クラスITransformableFilterValues
  3. Web pat に 2 つのメソッドがあり、それぞれがConnectionProvider属性を持ち、ドロップダウン コントロールのインスタンスを返す

問題:

カスタム フィルター Web パーツに 2 つの接続オプションが表示されますが、追加できるのは 1 つだけです。たとえば、Filter1(カスタム Web パーツ) に接続すると、再度 Web パーツDepartmentに接続できなくなります。Report Viewer

私の Web パーツには、次のようなメソッドがあります。  

[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 
}
4

2 に答える 2

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>");
            }
        }
    }
}
于 2009-08-06T21:17:56.853 に答える
0

私は似たようなことをしました。これは、正しい方向に向けるのに役立つ場合があります。フォーム ライブラリのデータを使用して、詳細なレポートを作成しました。レポート サービスを使用し、Web サービスを使用して共有ポイントに接続しました。http://server/_vti_bin/Lists.asmx。私が使用したレポート パラメーターは、アイテム ID または GUID でした。次に、レポート ビューアーを構成しました。フォーム ライブラリでは、JavaScript を使用してコンテキスト メニューをオーバーライドし、[レポートの表示] を追加しました。レポート ページでは、クエリ文字列フィルターを使用して、URL からアイテム ID を取得しました。

于 2008-12-04T19:09:50.807 に答える