IFilterProvider 接口

请注意:此 API 现在已过时。

用于与实现IFilterConsumer接口,以向使用者提供的筛选信息 Web 部件进行通信。

命名空间:  Microsoft.SharePoint.WebPartPages.Communication
程序集:  Microsoft.SharePoint(位于 Microsoft.SharePoint.dll 中)

语法

声明
<ObsoleteAttribute("Use System.Web.UI.WebControls.WebParts.IWebPartParameters instead")> _
Public Interface IFilterProvider
用法
Dim instance As IFilterProvider
[ObsoleteAttribute("Use System.Web.UI.WebControls.WebParts.IWebPartParameters instead")]
public interface IFilterProvider

备注

需要将筛选器值的集合传递给使用方 Web 部件的 Web 部件,应使用IFilterProvider接口。IFilterProvider事件旨在用于设置和清除多个筛选器值。它可在方案中使用者部件旨在提供的数据提供程序部件传递类型了解。由于IFilterProvider部件可以从IFilterConsumer部件收到初始化参数IFilterProvider部件可以动态更改其用户界面更好地满足到使用者部件的需求。IFilterProvider只能连接到IFilterConsumer接口。当连接到IFilterConsumerIFilterProvider ,这是直接连接,因此会不显示任何转换器对话框。此外,服务器端实现IFilterProvider可以连接到另一页上的部件通过与Microsoft SharePoint Foundation,如Microsoft SharePoint Designer兼容的 HTML 编辑器。

示例

下面的代码示例显示服务器端IFilterProvider Web 部件。它可以连接到另一个 Web 部件的服务器上实现IFilterConsumer接口。此IFilterProvider Web 部件将动态生成输入窗体基于由IFilterConsumer Web 部件发送给它的列。IFilterProvider Web 部件可用于将筛选器值传递给IFilterConsumer Web 部件。

特定于使其可连接的 Web 部件是 8 个步骤。以下步骤进行编号和在下面的代码示例中注释。

创建可连接 Web 部件的详细信息,请参阅Creating a Connectable Web Part。

' Common .NET required namespaces
Imports System
Imports System.ComponentModel
Imports System.Web.UI

' Web Part required namespaces
Imports Microsoft.SharePoint.WebPartPages
Imports System.Xml.Serialization
Imports System.Web.UI.WebControls

' Code Access Security namespaces
Imports System.Security
Imports Microsoft.SharePoint.Utilities

'Step #1: Make a reference to the Communication namespace
Imports Microsoft.SharePoint.WebPartPages.Communication

Namespace ConnectionCodeSamples
   'Step #2: Inherit from the WebPart base class and implement the IFilterProvider interface.
   
   Public Class ServerSideFilterProvider
      Inherits WebPart
      Implements IFilterProvider

      ' Step #3: Declare the IFilterProvider events.
      ' Because this class implements the IFilterProvider interface, it 
      ' must declare the interface members SetFilter, ClearFilter, 
      ' NoFilter. 
      Public Event SetFilter As SetFilterEventHandler Implements 
         IFilterProvider.SetFilter
      Public Event ClearFilter As ClearFilterEventHandler Implements 
         IFilterProvider.ClearFilter
      Public Event NoFilter As NoFilterEventHandler Implements 
         IFilterProvider.NoFilter
      
      ' Declare variables for keeping track of the connection state.
      Private _connected As Boolean = False
      Private _connectedWebPartTitle As String = String.Empty
      Private _registrationErrorMsg As String = "An error has occurred 
         trying to register your connection interfaces."
      Private _registrationErrorOccurred As Boolean = False
      Private _notConnectedMsg As String = "NOT CONNECTED. To use this 
         Web Part connect it to a Filter Consumer Web Part."
      
      ' Declare variables for the Web Part user interface.
      Private _connectedWebPartLabel As String = "Connected to Web 
         Part"
      Private _filterExpressionLabel As String = "FilterExpression sent"
      Private _fieldListKey As String = "ProviderFieldList" 'Key for 
         ViewState StateBag
      Private _filterExpression As String = String.Empty
      Private _setFilterButton As Button
      Private _clearFilterButton As Button
      Private _noFilterButton As Button
      Private _filterInputs() As TextBox
      
      ' Declare variables for tracking whether the button was clicked.
      Private _setFilterClicked As Boolean = False
      Private _clearFilterClicked As Boolean = False
      Private _noFilterClicked As Boolean = False
      
      ' Declare variables for filter information.
      Private _fieldList As String() = Nothing
      Private _fieldDisplayList As String() = Nothing
      Private FieldLabel As String = "FilterField"
      Private ValueLabel As String = "FilterValue"
     
      ' Step #4: Implement EnsureInterfaces method and call 
      ' RegisterInterface method.
      Public Overrides Sub EnsureInterfaces()
         ' If your Web Part is installed in the bin directory and the 
         ' Code Access Security (CAS) setting doesn't 
         ' allow Web Part Connections, an exception will be thrown. To 
         ' allow your Web Part to behave well and continue working, 
         ' a try/catch block should be used when attempting to register 
         ' interfaces.
         ' Web Part Connections will only work if the level attribute 
         ' of the <trust> tag in the web.config file is set to 
         ' WSS_Minimal, WSS_Medium, or Full. By default a new 
         ' SharePoint site is installed with the trust level set to 
         ' WSS_Minimal.
         Try
            ' Register the IFilterProvider interface.
            ' <param name="interfaceName">Friendly name of the 
            ' interface that is being implemented.</param>
            ' <param name="interfaceType">Specifies which interface is 
            ' being implemented.</param>
            ' <param name="maxConnections">Defines how many times this 
            ' interface can be connected.</param>
            ' <param name="runAtOptions">Determines where the interface 
            ' can run.</param>
            ' <param name="interfaceObject">Reference to the object 
            ' that is implementing this interface.</param>
            ' <param name="interfaceClientReference">Name used to 
            ' reference the interface on the client. 
            ' This is a server-side example so the value is set to 
            ' empty string.</param>
            ' <param name="menuLabel">Label for the interface that 
            ' appears in the UI</param>
            ' <param name="description">Description of the interface 
            ' that appears in the UI</param>
            ' <param name="allowCrossPageConnection">Specifies if the 
            ' interface can connect to a Web Part
            ' on a different page. This is an optional parameter with a 
            ' default of false. Note that only some 
            ' server-side interfaces are allowed to connect across 
            ' pages by the Web Part infrastructure. 
            ' The IFilterProvider interface is allowed to connect 
            ' across pages.</param>
            RegisterInterface("MyFilterProviderInterface", 
               InterfaceTypes.IFilterProvider, 
               WebPart.LimitOneConnection, ConnectionRunAt.Server, 
               Me, "", "Provide Filter To", "Provides a Filter to a 
               consumer Web Part.", True) 

         Catch se As SecurityException
            _registrationErrorOccurred = True
         End Try
      End Sub
      
      ' Step #5: Override the CanRunAt() method.
      ' The CanRunAt method is called by the Web Part infrastructure 
      ' during the ASP.NET PreRender event
      ' to determine where the Web Part can run based on its current 
      ' configuration.
      Public Overrides Function CanRunAt() As ConnectionRunAt
         ' This Web Part can run on the server.
         Return ConnectionRunAt.Server
      End Function
      
      ' Step #6: Override the PartCommunicationConnect() method.
      ' The PartCommunicationConnect method is called by the Web Part 
      ' infrastructure to notify the Web Part that it
      ' is connected during the ASP.NET PreRender event. Relevant 
      ' information is passed to the part such as 
      ' the interface it is connected over, the Web Part it is being 
      ' connected to, and where the part will be running, 
      ' either client or server-side. 
      ' <param name="interfaceName">Friendly name of the interface that 
      ' is being connected</param>
      ' <param name="connectedPart">Reference to the other Web Part 
      ' that is being connected to</param>
      ' <param name="connectedInterfaceName">Friendly name of the 
      ' interface on the other Web Part</param>
      ' <param name="runAt">Where the interface should execute</param>
      Public Overrides Sub PartCommunicationConnect(interfaceName As 
         String, connectedPart As WebPart, connectedInterfaceName As 
         String, runAt As ConnectionRunAt)
         ' Keep track of whether the Web Part is connected.
         If interfaceName = "MyFilterProviderInterface" Then
            _connected = True
            _connectedWebPartTitle = SPEncode.HtmlEncode(connectedPart.Title)
         End If
      End Sub
      
      ' Step #7: Override the PartCommunicationMain() method.
      ' The PartCommunicationMain method is called by the Web Part 
      ' infrastructure on the client during the ASP.NET PreRender
      ' event to allow the part to pass its primary data to the other 
      ' connected parts.
      ' It is important to always fire either the SetFilter, NoFilter, 
      ' or ClearFilter event. Some parts may not behave properly 
      ' if they are left waiting for this information.
      ' SetFilter should be fired to send the filter expression.
      ' NoFilter should be fired to indicate that there is no change in 
      ' the filter expression. 
      ' ClearFilter should be fired to indicate that the filter should 
      ' be removed.
      Public Overrides Sub PartCommunicationMain()
            ' Ensure that all of the Web Part's controls are created.
            EnsureChildControls()

            ' Check if connected.
            If _connected Then
                ' Check which button was clicked.
                If _setFilterClicked = True Then
                    ' Create the SetFilterEventArgs object for the 
                    ' SetFilter event.
                    Dim setFilterEventArgs As New SetFilterEventArgs()

                    ' Create the filter expression.
                    Dim eIndex As Integer = 1
                    Dim filterExpression As String = String.Empty
                    Dim index As Integer
                    For index = 0 To _fieldList.Length - 1
                        ' This filter expression syntax should be used 
                        ' with SharePoint Lists
                        ' and other Microsoft Web Parts that support 
                        ' the IFilterConsumer interface.
                        If _filterInputs(index).Text <> String.Empty 
                        Then
                            filterExpression += FieldLabel + 
                               eIndex.ToString() + "=" + 
                               _fieldList(index) + "&"
                            filterExpression += ValueLabel + 
                               eIndex.ToString() + "=" + 
                               _filterInputs(index).Text + "&"
                            eIndex += 1
                        End If
                    Next index

                    ' Trim Off Trailing '&'
                    If filterExpression.Length <> 0 Then
                        filterExpression = 
                           filterExpression.Substring(0, 
                           filterExpression.Length - 1)
                    End If
                    ' Set the FilterExpression property on the 
                    ' SetFilterEventArgs object.
                    setFilterEventArgs.FilterExpression = 
                       filterExpression

                    ' Set the _filterExpression variable for display in 
                    ' the user interface.
                    _filterExpression = filterExpression

                    ' Fire the event.
                    RaiseEvent SetFilter(Me, setFilterEventArgs)
                    _setFilterClicked = False

                ElseIf _clearFilterClicked = True Then
                    RaiseEvent ClearFilter(Me, New EventArgs())
                    _clearFilterClicked = False

                    ' Clear out values in input text boxes.
                    If Not (_filterInputs Is Nothing) Then
                        Dim index As Integer
                        For index = 0 To _filterInputs.Length - 1
                            _filterInputs(index).Text = String.Empty
                        Next index
                    End If
                ElseIf _noFilterClicked = True Then
                    RaiseEvent NoFilter(Me, New EventArgs())
                    _noFilterClicked = False
                Else
                    RaiseEvent NoFilter(Me, New EventArgs())
                End If
            End If
        End Sub
      
      ' Step #8: Implement the FilterConsumerInit() method.
      ' The connected consumer part will call this method during its 
      ' PartCommunicationInit phase
      ' to pass initialization information to the provider Web Part. 
      ' The column names from the consumer Web Part are passed in. In 
      ' this example, these values are used to dynamcially 
      ' generate the input text boxes in the provider Web Part.
      ' <param name="sender">Consumer Web Part</param>
      ' <param name="filterConsumerInitArgs">The args passed by the 
      ' Consumer</param>
      Public Sub FilterConsumerInit(sender As Object, 
         filterConsumerInitEventArgs As FilterConsumerInitEventArgs) 
         Implements IFilterProvider.FilterConsumerInit
         If Not (filterConsumerInitEventArgs.FieldList Is Nothing) Then
            _fieldList = filterConsumerInitEventArgs.FieldList
         Else
            _fieldList = Nothing
         End If 
         If Not (filterConsumerInitEventArgs.FieldDisplayList Is 
            Nothing) Then
            _fieldDisplayList = filterConsumerInitEventArgs.FieldDisplayList
         Else
            _fieldDisplayList = Nothing
         End If 
      End Sub
      
      Protected Overrides Sub RenderWebPart(output As HtmlTextWriter)
         ' Check for connection interface registration error.
         If _registrationErrorOccurred Then
            output.Write(_registrationErrorMsg)
            Return
         End If
         
         ' Check if connected.
         If _connected Then
            ' Line break.
            output.RenderBeginTag(HtmlTextWriterTag.Br)
            output.RenderEndTag()
            
            ' Generate input text boxes.
            Dim fieldName As String
            output.RenderBeginTag(HtmlTextWriterTag.Table)
            Dim index As Integer
            For index = 0 To _fieldDisplayList.Length - 1
               fieldName = _fieldDisplayList(index)
               
               output.RenderBeginTag(HtmlTextWriterTag.Tr)
               output.RenderBeginTag(HtmlTextWriterTag.Td)
               output.RenderBeginTag(HtmlTextWriterTag.B)
               output.Write((fieldName + ": "))
               output.RenderEndTag() 'End </B>
               output.RenderEndTag() 'End </TD>
               output.RenderBeginTag(HtmlTextWriterTag.Td)
               _filterInputs(index).RenderControl(output) 'Render text 
                  box
               output.RenderEndTag() 'End </TD>
               output.RenderEndTag() 'End </TR>
            Next index
            output.RenderEndTag() 'End <Table>
            ' Line break..
            output.RenderBeginTag(HtmlTextWriterTag.Br)
            output.RenderEndTag()
            
            ' Render the buttons.
            _setFilterButton.RenderControl(output)
            _clearFilterButton.RenderControl(output)
            _noFilterButton.RenderControl(output)
            
            ' Line break.
            output.RenderBeginTag(HtmlTextWriterTag.Br)
            output.RenderEndTag()
            
            ' Render the connected Web Part title.
            output.Write((_connectedWebPartLabel + ": "))
            output.RenderBeginTag(HtmlTextWriterTag.I)
            output.Write(_connectedWebPartTitle)
            output.RenderEndTag()
            
            ' Render the filter expression.
            output.Write("<br>")
            output.Write((_filterExpressionLabel + ": "))
            output.RenderBeginTag(HtmlTextWriterTag.I)
            output.Write(_filterExpression)
            output.RenderEndTag()
         
         Else
            ' The Web Part isn't connected.
            output.Write(_notConnectedMsg)
         End If
      End Sub
      
      ' Create the Web Part user interface controls.
      Protected Overrides Sub CreateChildControls()
         ' Create the buttons.
         _setFilterButton = New Button()
         _setFilterButton.ID = "SetFilterButton"
         _setFilterButton.Text = "Fire SetFilter"
         Controls.Add(_setFilterButton)
         
         _clearFilterButton = New Button()
         _clearFilterButton.ID = "ClearFilterButton"
         _clearFilterButton.Text = "Fire ClearFilter"
         Controls.Add(_clearFilterButton)
         
         _noFilterButton = New Button()
         _noFilterButton.ID = "NoFilterButton"
         _noFilterButton.Text = "Fire NoFilter"
         Controls.Add(_noFilterButton)
         
         ' Create the input field text boxes.
         ' The field names provided by the consumer Web Part needed to 
         ' be stored in a StateBag because 
         ' the page doesn't have the _fieldList in time after the first 
         ' postback to create the text box 
         ' controls and restore their view state.
         Dim providerFieldList As String = 
            CStr(ViewState(_fieldListKey))
         Dim fieldCount As Integer
         If providerFieldList Is Nothing AndAlso Not (_fieldList Is 
            Nothing) Then
                ' First postback of the page.
                ' Generate controls from _fieldList provided by 
                ' consumer Web Part.
                Dim FieldList As String() = _fieldList
                fieldCount = FieldList.Length

                _filterInputs = New TextBox(fieldCount - 1) {}

            Dim index As Integer
            For index = 0 To fieldCount - 1
               _filterInputs(index) = New TextBox()
               _filterInputs(index).ID = FieldList(index)
               Controls.Add(_filterInputs(index))
               
               ' Populate ViewState providerFieldList item to keep 
               ' track of field names.
               If index < fieldCount - 1 Then
                  ViewState(_fieldListKey) += 
                     FieldList(index).ToString() + ";"
               Else
                  ViewState(_fieldListKey) += 
                     FieldList(index).ToString()
               End If
            Next index
        ElseIf Not (providerFieldList Is Nothing) Then
                ' Subsequent postback of page. 
                ' Retrieve the field names from StateBag 
                ' providerFieldList
                'Need to parse the providerFieldList information to get 
                ' the individual fields
                Dim FieldList As String() = providerFieldList.Split(New 
                   [Char]() {";"c})
                fieldCount = FieldList.Length

                _filterInputs = New TextBox(fieldCount - 1) {}
            Dim index As Integer
            For index = 0 To fieldCount - 1
               _filterInputs(index) = New TextBox()
               _filterInputs(index).ID = FieldList(index)
               Controls.Add(_filterInputs(index))
            Next index
         End If
         
         ' Add event handler to listen for button's Click event.
         _setFilterClicked = False ' Initialize to false -- user hasn't 
            clicked yet
         AddHandler _setFilterButton.Click, AddressOf 
            SetFilterButtonClicked ' listen for Button's click event
         _clearFilterClicked = False ' Initialize to false -- user 
            hasn't clicked yet
         AddHandler _clearFilterButton.Click, AddressOf 
            ClearFilterButtonClicked ' listen for Button's click event
         _noFilterClicked = False ' Initialize to false -- user hasn't 
            clicked yet
         AddHandler _noFilterButton.Click, AddressOf 
            NoFilterButtonClicked ' listen for Button's click event
      End Sub
      
      ' The button OnClick event handler.
      ' <param name="sender">The Button object</param>
      ' <param name="e">The Event Arguments</param>
      Private Sub SetFilterButtonClicked(sender As Object, e As 
         EventArgs)
         _setFilterClicked = True 'user clicked button, set to true
      End Sub
      
      Private Sub ClearFilterButtonClicked(sender As Object, e As 
         EventArgs)
         _clearFilterClicked = True 'user clicked button, set to true
      End Sub
      
      Private Sub NoFilterButtonClicked(sender As Object, e As 
         EventArgs)
         _noFilterClicked = True 'user clicked button, set to true
      End Sub
   End Class
End Namespace
// Common .NET required namespaces
using System;
using System.ComponentModel;
using System.Web.UI;


// Web Part required namespaces
using Microsoft.SharePoint.WebPartPages;
using System.Xml.Serialization;
using System.Web.UI.WebControls;

// Code Access Security namespaces
using System.Security;
using Microsoft.SharePoint.Utilities;

//Step #1: Make a reference to the Communication namespace
using Microsoft.SharePoint.WebPartPages.Communication;


namespace ConnectionCodeSamples
{
    //Step #2: Inherit from the WebPart base class and implement the 
    // IFilterProvider interface.
    public class ServerSideFilterProvider : WebPart, IFilterProvider
    {    
        // Step #3: Declare the IFilterProvider events.
        // Because this class implements the IFilterProvider interface, 
        // it must declare the interface members SetFilter, 
        // ClearFilter, NoFilter. 
        public event SetFilterEventHandler SetFilter;
        public event ClearFilterEventHandler ClearFilter;
        public event NoFilterEventHandler NoFilter;        

        // Declare variables for keeping track of the connection state.
        private bool _connected = false;
        private string _connectedWebPartTitle = string.Empty;
        private string _registrationErrorMsg = "An error has occurred trying to register your connection interfaces.";
        private bool _registrationErrorOccurred = false;
        private string _notConnectedMsg = "NOT CONNECTED. To use this 
           Web Part connect it to a Filter Consumer Web Part.";

        // Declare variables for the Web Part user interface.
        private string _connectedWebPartLabel = "Connected to Web 
           Part";
        private string _filterExpressionLabel = "FilterExpression 
           sent";
        private string _fieldListKey = "ProviderFieldList"; 
        //Key for ViewState StateBag
        private string _filterExpression = string.Empty;
        private Button _setFilterButton;
        private Button _clearFilterButton;
        private Button _noFilterButton;
        private TextBox[] _filterInputs;
        
        // Declare variables for tracking whether the button was 
        // clicked.
        private bool _setFilterClicked = false;
        private bool _clearFilterClicked = false;
        private bool _noFilterClicked = false;

        // Declare variables for filter information.
        private string[] _fieldList  = null;
        private string[] _fieldDisplayList = null;
        private string FieldLabel = "FilterField";
        private string ValueLabel = "FilterValue";
        
        // Step #4: Implement EnsureInterfaces method and call 
        // RegisterInterface method.
        public override void EnsureInterfaces()
        {
            // If your Web Part is installed in the bin directory and 
            // the Code Access Security (CAS) setting doesn't 
            // allow Web Part Connections, an exception will be thrown. 
            // To allow your Web Part to behave 
            // well and continue working, a try/catch block should be 
            // used when attempting to register interfaces.
            // Web Part Connections will only work if the level 
            // attribute of the <trust> tag in the 
            // web.config file is set to WSS_Minimal, WSS_Medium, or 
            // Full. By default a new SharePoint site
            // is installed with the trust level set to WSS_Minimal.
            try
            {
                // Register the IFilterProvider interface.
                // <param name="interfaceName">Friendly name of the 
                // interface that is being implemented.</param>
                // <param name="interfaceType">Specifies which 
                // interface is being implemented.</param>
                // <param name="maxConnections">Defines how many times 
                // this interface can be connected.</param>
                // <param name="runAtOptions">Determines where the 
                // interface can run.</param>
                // <param name="interfaceObject">Reference to the 
                // object that is implementing this interface.</param>
                // <param name="interfaceClientReference">Name used to 
                // reference the interface on the client. 
                // This is a server-side example so the value is set to 
                // empty string.</param>
                // <param name="menuLabel">Label for the interface 
                // tht appears in the UI</param>
                // <param name="description">Description of the 
                // interface that appears in the UI</param>
                // <param name="allowCrossPageConnection">Specifies if 
                // the interface can connect to a Web Part
                // on a different page. This is an optional parameter 
                // with a default of false. Note that only some 
                // server-side interfaces are allowed to connect across 
                // pages by the Web Part infrastructure. 
                // The IFilterProvider interface is allowed to connect 
                // across pages.</param>
                RegisterInterface("MyFilterProviderInterface",                //InterfaceName    
                    InterfaceTypes.IFilterProvider,                           //InterfaceType
                    WebPart.LimitOneConnection,                               //MaxConnections
                    ConnectionRunAt.Server,                                   //RunAtOptions
                    this,                                                     //InterfaceObject
                    "",                                                       //InterfaceClientReference
                    "Provide Filter To",                                      //MenuLabel
                    "Provides a Filter to a consumer Web Part.",              //Description
                    true);                                                    //allowCrossPageConnection
            }
            catch(SecurityException se)
            {
                _registrationErrorOccurred = true;
            }
        }

        // Step #5: Override the CanRunAt() method.
        // The CanRunAt method is called by the Web Part infrastructure 
        // during the ASP.NET PreRender event
        // to determine where the Web Part can run based on its current 
        // configuration.
        public override ConnectionRunAt CanRunAt()
        {
            // This Web Part can run on the server.
            return ConnectionRunAt.Server;
        }

        // Step #6: Override the PartCommunicationConnect() method.
        // The PartCommunicationConnect method is called by the Web 
        // Part infrastructure to notify the Web Part that it
        // is connected during the ASP.NET PreRender event. Relevant 
        // information is passed to the part such as 
        // the interface it is connected over, the Web Part it is being 
        // conected to, and where the part will be running, 
        // either client or server-side. 
        // <param name="interfaceName">Friendly name of the interface 
        // that is being connected</param>
        // <param name="connectedPart">Reference to the other Web Part 
        // that is being connected to</param>
        // <param name="connectedInterfaceName">Friendly name of the 
        // interface on the other Web Part</param>
        // <param name="runAt">Where the interface should 
        // execute</param>
        public override void PartCommunicationConnect(
            string interfaceName,
            WebPart connectedPart,
            string connectedInterfaceName,
            ConnectionRunAt runAt)
        {
            // Keep track of whether the Web Part is connected.
            if (interfaceName == "MyFilterProviderInterface")
            {
                _connected = true;
                _connectedWebPartTitle = 
                   SPEncode.HtmlEncode(connectedPart.Title);
            }
        }

        // Step #7: Override the PartCommunicationMain() method.
        // The PartCommunicationMain method is called by the Web Part 
        // infrastructure on the client during the ASP.NET PreRender
        // event to allow the part to pass its primary data to the 
        // other connected parts.
        // It is important to always fire either the SetFilter, 
        // NoFilter, or ClearFilter event. Some parts
        // may not behave properly if they are left waiting for this 
        // information.
        // SetFilter should be fired to send the filter expression.
        // NoFilter should be fired to indicate that there is no change 
        // in the filter expression.
        // ClearFilter should be fired to indicate that the filter 
        // should be removed.
        public override void PartCommunicationMain()
        {
            // Ensure that all of the Web Part's controls are created.
            EnsureChildControls();

            // Check if connected.
            if(_connected)
            {
                // Check which button was clicked.
                if(_setFilterClicked == true)
                {
                    // If there is a listener, fire the SetFilter 
                    // event.
                    if (SetFilter != null)
                    {
                        // Create the SetFilterEventArgs object for the 
                        // SetFilter event.
                        SetFilterEventArgs setFilterEventArgs = new 
                           SetFilterEventArgs();

                        // Create the filter expression.
                        int eIndex = 1;
                        string filterExpression = string.Empty;
                        for (int index = 0; index < _fieldList.Length; 
                           index++)
                        {
                            // This filter expression syntax should be 
                            // used with SharePoint lists
                            // and other Microsoft Web Parts that 
                            // support the IFilterConsumer interface.
                            if (_filterInputs[index].Text != 
                               string.Empty)
                            {
                                filterExpression += FieldLabel + 
                                   eIndex.ToString() + "=" + 
                                   _fieldList[index] + "&";
                                filterExpression += ValueLabel + 
                                   eIndex.ToString()  + "=" + 
                                   _filterInputs[index].Text + "&";
                                eIndex++;
                            }
                        }

                        // Trim Off Trailing '&'
                        if (filterExpression.Length != 0)
                            filterExpression = filterExpression.Substring(0,filterExpression.Length - 1);

                        // Set the FilterExpression property on the 
                        // SetFilterEventArgs object.
                        setFilterEventArgs.FilterExpression = 
                           filterExpression;

                        // Set the _filterExpression variable for 
                        // display in the user interface.
                        _filterExpression = filterExpression;

                        // Fire the event.
                        SetFilter(this, setFilterEventArgs);

                        _setFilterClicked = false;
                    }
                }
                else if(_clearFilterClicked == true)
                {
                    // If there is a listener, fire the ClearFilter 
                    // event.
                    if (ClearFilter != null)
                    {
                        ClearFilter(this, new EventArgs());

                        _clearFilterClicked = false;

                        // Clear out values in input text boxes.
                        if (_filterInputs != null)
                        {
                            for (int index = 0; index < 
                               _filterInputs.Length; index++)
                               _filterInputs[index].Text = 
                               string.Empty;
                        }
                    }
                }
                else if(_noFilterClicked == true)
                {
                    // If there is a listener, fire the NoFilter event.
                    if (NoFilter != null)
                    {
                        NoFilter(this, new EventArgs());

                        _noFilterClicked = false;
                    }
                }
                else
                {
                    // If there is a listener, fire the NoFilter event.
                    if (NoFilter != null)
                    {
                        NoFilter(this, new EventArgs());
                    }
                }
            }
        }


        // Step #8: Implement the FilterConsumerInit() method.
        // The connected consumer part will call this method during its 
        // PartCommunicationInit phase
        // to pass initialization information to the provider Web Part. 
        // The column names from the
        // consumer Web Part are passed in. In this example, these 
        // values are used to dynamcially 
        // generate the input text boxes in the provider Web Part.
        // <param name="sender">Consumer Web Part</param>
        // <param name="filterConsumerInitArgs">The args passed by the 
        // Consumer</param>
        public void FilterConsumerInit(object sender, 
           FilterConsumerInitEventArgs filterConsumerInitEventArgs)
        {
            if(filterConsumerInitEventArgs.FieldList != null)
                _fieldList = filterConsumerInitEventArgs.FieldList;
            else
                _fieldList = null;

            if(filterConsumerInitEventArgs.FieldDisplayList != null)
                _fieldDisplayList = filterConsumerInitEventArgs.FieldDisplayList;
            else
                _fieldDisplayList = null;

        }

        protected override void RenderWebPart(HtmlTextWriter output)
        {
            // Check for connection interface registration error.
            if (_registrationErrorOccurred)
            {
                output.Write(_registrationErrorMsg);
                return;
            }

            // Check if connected.
            if(_connected)
            {
                // Line break.
                output.RenderBeginTag(HtmlTextWriterTag.Br);
                output.RenderEndTag();

                // Generate input text boxes.
                string fieldName;
                output.RenderBeginTag(HtmlTextWriterTag.Table);
                for (int index = 0; index < _fieldDisplayList.Length; 
                   index++)
                {
                    fieldName = _fieldDisplayList[index];
                    
                    output.RenderBeginTag(HtmlTextWriterTag.Tr);
                    output.RenderBeginTag(HtmlTextWriterTag.Td);
                    output.RenderBeginTag(HtmlTextWriterTag.B);
                    output.Write(fieldName + ": ");
                    output.RenderEndTag(); //End </B>
                    output.RenderEndTag(); //End </TD>

                    output.RenderBeginTag(HtmlTextWriterTag.Td);
                    _filterInputs[index].RenderControl(output); //Render text box
                    output.RenderEndTag(); //End </TD>
                    output.RenderEndTag(); //End </TR>
                }
                output.RenderEndTag(); //End <Table>

                // Line break..
                output.RenderBeginTag(HtmlTextWriterTag.Br);
                output.RenderEndTag();

                // Render the buttons.
                _setFilterButton.RenderControl(output);
                _clearFilterButton.RenderControl(output);
                _noFilterButton.RenderControl(output);

                // Line break.
                output.RenderBeginTag(HtmlTextWriterTag.Br);
                output.RenderEndTag();

                // Render the connected Web Part title.
                output.Write(_connectedWebPartLabel + ": ");
                output.RenderBeginTag(HtmlTextWriterTag.I);
                output.Write(_connectedWebPartTitle);
                output.RenderEndTag();

                // Render the filter expression.
                output.Write("<br>");
                output.Write(_filterExpressionLabel + ": ");
                output.RenderBeginTag(HtmlTextWriterTag.I);
                output.Write(_filterExpression);
                output.RenderEndTag();

            }
            else
            {
                // The Web Part isn't connected.
                output.Write(_notConnectedMsg);
            }
        }

        // Create the Web Part user interface controls.
        protected override void CreateChildControls()
        {
            // Create the buttons.
            _setFilterButton = new Button();
            _setFilterButton.ID = "SetFilterButton";
            _setFilterButton.Text = "Fire SetFilter";
            Controls.Add(_setFilterButton);

            _clearFilterButton = new Button();
            _clearFilterButton.ID = "ClearFilterButton";
            _clearFilterButton.Text = "Fire ClearFilter";
            Controls.Add(_clearFilterButton);

            _noFilterButton = new Button();
            _noFilterButton.ID = "NoFilterButton";
            _noFilterButton.Text = "Fire NoFilter";
            Controls.Add(_noFilterButton);

            // Create the input field text boxes.
            // The field names provided by the consumer Web Part needed 
            // to be stored in a StateBag because 
            // the page doesn't have the _fieldList in time after the 
            // first postback to create the text box 
            // controls and restore their view state.
            string providerFieldList = 
              (string)ViewState[_fieldListKey];
            int fieldCount;
            if (providerFieldList == null && _fieldList != null)
            {
                // First postback of the page.
                // Generate controls from _fieldList provided by 
                // consumer Web Part.
                string[] FieldList = _fieldList;
                fieldCount = FieldList.Length;
            
                _filterInputs = new TextBox[fieldCount];
                for (int index = 0; index < fieldCount; index++)
                {
                    _filterInputs[index] = new TextBox();
                    _filterInputs[index].ID = FieldList[index];
                    Controls.Add(_filterInputs[index]);

                    // Populate ViewState providerFieldList item to 
                    // keep track of field names.
                    if (index < fieldCount - 1)
                        ViewState[_fieldListKey] += 
                           FieldList[index].ToString() + ";";
                    else
                        ViewState[_fieldListKey] += 
                           FieldList[index].ToString();
                }
            }
            else if (providerFieldList != null)
            {
                // Subsequent postback of page. 
                // Retrieve the field names from StateBag 
                // providerFieldList
                // Need to parse the providerFieldList information to 
                // get the individual fields
                string[] FieldList = providerFieldList.Split(new Char[] 
                   {';'});
                fieldCount = FieldList.Length;

                _filterInputs = new TextBox[fieldCount];
                for (int index = 0; index < fieldCount; index++)
                {
                    _filterInputs[index] = new TextBox();
                    _filterInputs[index].ID = FieldList[index];
                    Controls.Add(_filterInputs[index]);
                }
            }

            // Add event handler to listen for button's Click event.
            _setFilterClicked = false; // Initialize to false -- user 
               hasn't clicked yet
            _setFilterButton.Click += new 
               EventHandler(SetFilterButtonClicked); 
            // listen for Button's click event

            _clearFilterClicked = false; // Initialize to false -- user 
               hasn't clicked yet
            _clearFilterButton.Click += new 
               EventHandler(ClearFilterButtonClicked); 
           // listen for Button's click event
    
            _noFilterClicked = false; // Initialize to false -- user 
               hasn't clicked yet
            _noFilterButton.Click += new 
               EventHandler(NoFilterButtonClicked); 
            // listen for Button's click event
        }

        // The button OnClick event handler.
        // <param name="sender">The Button object</param>
        // <param name="e">The Event Arguments</param>
        private void SetFilterButtonClicked(object sender, EventArgs e)
        {
            _setFilterClicked = true; //user clicked button, set to 
               true
        }

        private void ClearFilterButtonClicked(object sender, EventArgs e)
        {
            _clearFilterClicked = true; //user clicked button, set to 
               true
        }
    
        private void NoFilterButtonClicked(object sender, EventArgs e)
        {
            _noFilterClicked = true; //user clicked button, set to true
        }
    }
}

另请参阅

引用

IFilterProvider 成员

Microsoft.SharePoint.WebPartPages.Communication 命名空间