SharePoint自定义筛选器Web部件

3
我想创建一个自定义的Web部件,它包含不止一个筛选器Web部件,并且可以在运行时/设计时连接到报告查看器Web部件(集成模式)。
我为此搜索了很多,但无法找到一种方法来拥有单个Web部件,该部件是多个过滤器的提供者。
例如:
1. 我的“报告”接受两个参数“部门”和“区域”。
2. 我想用一个带有两个下拉框的单个Web部件连接两个参数(一个用于“部门”,一个用于“区域”)。
3. 从两个下拉框中获取值应传递给“部门”和“区域”。
4. 报告应呈现在报表查看器Web部件中。
尝试过的解决方案如下:
1. 创建一个添加了两个自定义下拉框的Web部件。
2. 自定义下拉框类实现了“ITransformableFilterValues”。
3. Web部件上有两种方法,每种方法都有一个“ConnectionProvider”属性,并返回下拉控件的实例。
问题:
即使我的自定义筛选器Web部件显示了两个连接选项,但只能添加其中一个。例如,如果我将“Filter1”(自定义Web部件)连接到“Department”,那么我就无法再将其连接到“Report Viewer” Web部件。
我的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 
}

这实际上是ASP中的一个继承问题。http://forums.asp.net/p/1118366/2646773.aspx - knight0323
2个回答

0

我做过类似的事情。这可能会帮助您朝着正确的方向前进。我使用表单库中的数据生成了详细报告。我使用报告服务并使用Web服务连接到Sharepointhttp://server/_vti_bin/Lists.asmx。我使用的报告参数是项ID或GUID。然后我配置了我的报告查看器。在表单库中,我使用JavaScript覆盖上下文菜单以添加“查看报告”。在报告页面上,我使用查询字符串过滤器从URL中获取项目ID。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接