IFilterConsumer 接口
请注意:此 API 现在已过时。
用于使用从已实现IFilterProvider接口的 Web 部件筛选器表达式。
命名空间: Microsoft.SharePoint.WebPartPages.Communication
程序集: Microsoft.SharePoint(位于 Microsoft.SharePoint.dll 中)
语法
声明
<ObsoleteAttribute("Use System.Web.UI.WebControls.WebParts.IWebPartParameters instead")> _
Public Interface IFilterConsumer
用法
Dim instance As IFilterConsumer
[ObsoleteAttribute("Use System.Web.UI.WebControls.WebParts.IWebPartParameters instead")]
public interface IFilterConsumer
备注
需要使用一个或多个筛选器值的集合的部件,应使用IFilterConsumer接口。IFilterConsumer的事件处理程序旨在用于设置和清除多个筛选器值。IFilterConsumer部件能够将初始化参数发送到提供程序部件。IFilterConsumer可连接到的IFilterProvider和IRowProvider接口。当连接到IFilterProviderIFilterConsumer ,这是直接连接,因此会不显示任何转换器对话框。若要正确使用传递的值,使用部件可能需要与服务提供商传递的数据了解设计。当连接到IRowProviderIFilterConsumer ,转换器对话框将显示允许最终用户映射到输入筛选器的行中的列。可以映射只有一个值,但它使最终用户能够更改在任何时候的筛选器映射。服务器端实现的IFilterConsumer可以也可以连接到另一页上的部件使用 HTML 编辑器与Microsoft SharePoint Foundation,如Microsoft SharePoint Designer兼容。
示例
下面的代码示例显示服务器端IFilterConsumer Web 部件。它可以连接到另一个 Web 部件的服务器上实现IFilterProvider或IRowProvider接口。IFilterConsumer Web 部件显示的列表提供程序 Web 部件发送的值可以进行筛选。
特定于使其可连接的 Web 部件是 11 的步骤。以下步骤进行编号和在下面的代码示例中注释。
创建可连接 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
' DataGrid and user interface namespaces
Imports System.Data
Imports System.Drawing
' Step #1: Reference the Communication namespace.
Imports Microsoft.SharePoint.WebPartPages.Communication
Namespace ConnectionCodeSamples
' Step #2: Implement the IFilterConsumer interface.
Public Class ServerSideFilterConsumer
Inherits WebPart
Implements IFilterConsumer
' Step #3: Declare the IFilterConsumer event.
' Because this class implements the IFilterConsumer interface, it
' must declare the interface member FilterConsumerInit.
Public Event FilterConsumerInit As FilterConsumerInitEventHandler Implements IFilterConsumer.FilterConsumerInit
' Declare variables for keeping track of 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 filter this Web Part connect it to a Filter or Row Provider Web Part."
' Declare variables for Web Part user interface.
Private _connectedWebPartLabel As String = "Connected to Web Part"
Private _convertedRowFilterLabel As String = "Converted Row Filter"
Private _dataGrid As DataGrid
Private _rowFilterExpression As String = String.Empty
Private _cachedRowFilter As TextBox
' Declare variables for filter field information.
Private _filterFieldNames() As String
Private _filterFieldDisplayNames() As String
Private FieldLabel As String = "FilterField"
Private ValueLabel As String = "FilterValue"
' Step #4: Override EnsureInterfaces method and call
' RegisterInterface method.
' EnsureInterfaces() is called by the Web Part infrastructure
' during the ASP.NET PreRender event
' and allows the part to register all of its connection
' interfaces.
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 IFilterConsumer 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 IFilterConsumer interface is allowed to connect
' across pages.</param>
RegisterInterface("MyFilterConsumerInterface", InterfaceTypes.IFilterConsumer, WebPart.LimitOneConnection, ConnectionRunAt.Server, Me, "", "Consume Filter From", "Consumes a Filter from another Web Part.", True)
Catch se As SecurityException
_registrationErrorOccurred = True
End Try
End Sub
' Step #5: Override the CanRunAt method.
' CanRunAt() 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.
' PartCommunicationConnect() 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)
'Check if this is my particular Filter interface
If interfaceName = "MyFilterConsumerInterface" Then
'Keep track of the Connection
_connected = True
_connectedWebPartTitle = SPEncode.HtmlEncode(connectedPart.Title)
End If
End Sub
' Step #7: Override the PartCommunicationInit method.
' PartCommunicationInit() is called by the Web Part
' infrastructure during the ASP.NET PreRender event
' to allow the part to pass initialization information to the
' other connected parts.
' It is important to always pass initialization information. Some
' parts may not behave properly if this initialization
' information is not received.
Public Overrides Sub PartCommunicationInit()
' If the connection wasn't actually formed then don't want
' to send Init event
If _connected Then
' Ensure that all of the Web Part's controls are
' created
' The _filterFieldNames and _filterFieldDisplayNames
' are set during EnsureChildControls()
EnsureChildControls()
' Create the FilterConsumerInitEventArgs object for the
' FilterConsumerInit event.
Dim filterConsumerInitArgs As New FilterConsumerInitEventArgs()
' Set the field names.
filterConsumerInitArgs.FieldList = _filterFieldNames
filterConsumerInitArgs.FieldDisplayList = _filterFieldDisplayNames
' Fire the FilterConsumerInit event.
RaiseEvent FilterConsumerInit(Me, filterConsumerInitArgs)
End If
End Sub
' Step #8: Override the GetInitEventArgs method.
' GetInitEventArgs() is called by the Web Part infrastructure
' during the ASP.NET PreRender event to gather the
' necessary information it needs to build the transformer dialog.
' The transformer dialog is needed when connecting different
' interfaces such as IRowProvider to ICellConsumer. The
' transformer dialog allows the user to map the fields between
' the interfaces. The GetInitEventArgs()method only needs to be
' implemented for interfaces that can participate in a
' transformer which are the following:
' ICellConsumer, IRowProvider, IFilterConsumer,
' IParametersOutProvider, IParametersInConsumer.
' <param name="interfacename">Name of interface on which the Web
' Part infrastructure is requesting information</param>
' <returns>An InitEventArgs object</returns>
Public Overrides Function GetInitEventArgs(interfaceName As String) As InitEventArgs
' Check if this is my particular cell interface.
If interfaceName = "MyFilterConsumerInterface" Then
'Ensure that all of the Web Part's controls are created.
'The _filterFieldNames and _filterFieldDisplayNames are set
' during EnsureChildControls()
EnsureChildControls()
' Create the FilterConsumerInitEventArgs object for the
' FilterConsumerInit event.
Dim filterConsumerInitArgs As New FilterConsumerInitEventArgs()
' Set the field names
filterConsumerInitArgs.FieldList = _filterFieldNames
filterConsumerInitArgs.FieldDisplayList = _filterFieldDisplayNames
' return the FilterConsumerInitEventArgs.
Return filterConsumerInitArgs
Else
Return Nothing
End If
End Function
' Step #9: Implement the SetFilter event handler.
' The connected provider part will call this method during its
' PartCommunicationMain phase
' to set the filter on the consumer Web Part.
' <param name="sender">Provider Web Part</param>
' <param name="SetFilterArgs">The args passed by the
' Provider</param>
Public Sub SetFilter(sender As Object, setFilterEventArgs As SetFilterEventArgs) Implements IFilterConsumer.SetFilter
' Ensure that all of the Web Part's controls are created.
EnsureChildControls()
' Convert FilterExpression to the DataTable RowFilter syntax.
If Not (setFilterEventArgs.FilterExpression Is Nothing) Then
' Parse the filter information.
Dim values As String() = setFilterEventArgs.FilterExpression.Split(New [Char]() {"&"c})
If values.Length > 1 Then
Dim j As Integer = 1 'counts the number of Field/Value pairs
Dim filterField As String = String.Empty
Dim filterValue As String = String.Empty
Dim filterAnd As String = " AND "
_rowFilterExpression = String.Empty
Dim i As Integer
For i = 0 To values.Length - 1
' Clear values.
filterField = String.Empty
filterValue = String.Empty
' Create label portion of name/value pairs.
Dim currField, currValue As String
currField = FieldLabel + j.ToString() + "="
currValue = ValueLabel + j.ToString() + "="
j += 1
' Extract just the field name by replacing the rest
' of the string with string.Empty.
filterField = filterField + values(i).Replace(currField, String.Empty)
' Move to next item in the array which is the value
' component.
i += 1
' Extract just the Value by replacing the rest of the
' string with string.Empty.
filterValue = filterValue + values(i).Replace(currValue, String.Empty)
' Contruct the row filter expression.
_rowFilterExpression += filterField + "=" + "'" + filterValue + "'" + filterAnd
Next i
' Trim Off the trailing 'And'.
If _rowFilterExpression.Length <> 0 Then
_rowFilterExpression = _rowFilterExpression.Substring(0, _rowFilterExpression.Length - filterAnd.Length)
End If
' Store _rowFilterExpression for use by NoFilter event.
_cachedRowFilter.Text = _rowFilterExpression
End If
End If
End Sub
' Step #10: Implement the ClearFilter event handler.
' The connected provider part will call this method during its
' PartCommunicationMain phase
' to remove the filter on the consumer Web Part.
' <param name="sender">Provider Web Part</param>
' <param name="eventArgs">The Event Arguments</param>
Public Sub ClearFilter(sender As Object, eventArgs As EventArgs) Implements IFilterConsumer.ClearFilter
' Ensure that all of the Web Part's controls are created.
EnsureChildControls()
' Clear the filter on the DataTable.
_rowFilterExpression = String.Empty
' Clear out the cached row filter expression.
_cachedRowFilter.Text = String.Empty
End Sub
' Step #11: Implement NoFilter event handler.
' The connected provider part will call this method during its
' PartCommunicationMain phase to indicate there is no change in
' the filter. This allows the consumer part to
' display its cached data instead of recalculating the filter
' expression or potentially hitting a database again.
' <param name="sender">Provider Web Part</param>
' <param name="eventArgs">The Event Arguments</param>
Public Sub NoFilter(sender As Object, eventArgs As EventArgs) Implements IFilterConsumer.NoFilter
' Ensure that all of the Web Part's controls are created.
EnsureChildControls()
' No change in the filter so use cached _cachedRowFilter.
_rowFilterExpression = _cachedRowFilter.Text
End Sub
Protected Overrides Sub RenderWebPart(output As HtmlTextWriter)
'Check for connection interface registration error
If _registrationErrorOccurred Then
output.Write(_registrationErrorMsg)
Return
End If
' Ensure that all of the Web Part's controls are created.
EnsureChildControls()
' Row filter expression supplied by provider.
output.RenderBeginTag(HtmlTextWriterTag.B)
output.Write((_convertedRowFilterLabel + ": "))
output.RenderEndTag()
output.Write(_rowFilterExpression)
' Line break.
output.RenderBeginTag(HtmlTextWriterTag.Br)
output.RenderEndTag()
' Set filter.
CType(_dataGrid.DataSource, DataTable).DefaultView.RowFilter = _rowFilterExpression
_dataGrid.DataBind()
' Render the DataGrid control.
_dataGrid.RenderControl(output)
'Line break.
output.RenderBeginTag(HtmlTextWriterTag.Br)
output.RenderEndTag()
' Hidden Row Filter TextBox stores _rowFilterExpression.
_cachedRowFilter.RenderControl(output)
' Check if connected.
If _connected Then
' Render connected Web Part title.
output.Write((_connectedWebPartLabel + ": "))
output.RenderBeginTag(HtmlTextWriterTag.I)
output.Write(_connectedWebPartTitle)
output.RenderEndTag()
output.Write("<br>")
Else
' The Web Part isn't connected.
output.Write(_notConnectedMsg)
End If
End Sub
' Create Web Part user interface controls.
Protected Overrides Sub CreateChildControls()
' Create hidden textbox to store _rowFilterExpression.
_cachedRowFilter = New TextBox()
_cachedRowFilter.ID = "CachedRowFilter"
_cachedRowFilter.Visible = False
Controls.Add(_cachedRowFilter)
' Create the DataGrid.
_dataGrid = New DataGrid()
_dataGrid.ID = "DataGrid"
' Create the DataTable.
Dim dataTable As New DataTable()
' Add four column objects to the table.
Dim idColumn As New DataColumn()
idColumn.DataType = System.Type.GetType("System.Int32")
idColumn.ColumnName = "ID"
idColumn.Caption = "ID"
idColumn.AutoIncrement = True
dataTable.Columns.Add(idColumn)
Dim Product As New DataColumn()
Product.DataType = System.Type.GetType("System.String")
Product.ColumnName = "Product"
Product.Caption = "Product"
dataTable.Columns.Add(Product)
Dim productCategory As New DataColumn()
productCategory.DataType = System.Type.GetType("System.String")
productCategory.ColumnName = "Category"
productCategory.Caption = "Category"
dataTable.Columns.Add(productCategory)
Dim Stock As New DataColumn()
Stock.DataType = System.Type.GetType("System.Int32")
Stock.ColumnName = "Stock"
Stock.Caption = "Stock"
dataTable.Columns.Add(Stock)
' Once a table has been created, use the NewRow method to
' create a DataRow.
Dim dataRow As DataRow
' Add first row to collection.
dataRow = dataTable.NewRow()
dataRow("Product") = "Aniseed Syrup"
dataRow("Category") = "Condiments"
dataRow("Stock") = 25
dataTable.Rows.Add(dataRow)
' Add a second row.
dataRow = dataTable.NewRow()
dataRow("Product") = "Vegie-spread"
dataRow("Category") = "Condiments"
dataRow("Stock") = 10
dataTable.Rows.Add(dataRow)
' Add a third row.
dataRow = dataTable.NewRow()
dataRow("Product") = "Outback Lager"
dataRow("Category") = "Beverages"
dataRow("Stock") = 30
dataTable.Rows.Add(dataRow)
' Add a fourth row.
dataRow = dataTable.NewRow()
dataRow("Product") = "Boston Crab Meat"
dataRow("Category") = "Seafood"
dataRow("Stock") = 10
dataTable.Rows.Add(dataRow)
' Add a fifth row.
dataRow = dataTable.NewRow()
dataRow("Product") = "Tofu"
dataRow("Category") = "Produce"
dataRow("Stock") = 41
dataTable.Rows.Add(dataRow)
' Set the DataGrid's DataSource.
_dataGrid.DataSource = dataTable
' Format the DataGrid.
_dataGrid.HeaderStyle.Font.Bold = True
_dataGrid.HeaderStyle.ForeColor = Color.DarkBlue
_dataGrid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
_dataGrid.AlternatingItemStyle.BackColor = Color.Beige
_dataGrid.DataBind()
Controls.Add(_dataGrid)
' Set the DataTable field names.
' This information will be passed to the Provider Web Part
' when firing the FilterConsumerInit event.
Dim columnCount As Integer = dataTable.Columns.Count
_filterFieldNames = New String(columnCount-1) {}
_filterFieldDisplayNames = New String(columnCount-1) {}
Dim i As Integer
For i = 0 To columnCount - 1
_filterFieldNames(i) = dataTable.Columns(i).ColumnName
_filterFieldDisplayNames(i) = dataTable.Columns(i).Caption
Next i
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;
// DataGrid and user interface namespaces
using System.Data;
using System.Drawing;
// Step #1: Reference the Communication namespace.
using Microsoft.SharePoint.WebPartPages.Communication;
namespace ConnectionCodeSamples
{
// Step #2: Implement the IFilterConsumer interface.
public class ServerSideFilterConsumer : WebPart, IFilterConsumer
{
// Step #3: Declare the IFilterConsumer event.
// Because this class implements the IFilterConsumer interface,
// it must declare the interface member FilterConsumerInit.
public event FilterConsumerInitEventHandler FilterConsumerInit;
// Declare variables for keeping track of 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 filter this Web Part connect it to a Filter or Row Provider Web Part.";
// Declare variables for Web Part user interface.
private string _connectedWebPartLabel = "Connected to Web Part";
private string _convertedRowFilterLabel ="Converted Row Filter";
private DataGrid _dataGrid;
private string _rowFilterExpression = string.Empty;
private TextBox _cachedRowFilter;
// Declare variables for filter field information.
private string[] _filterFieldNames;
private string[] _filterFieldDisplayNames;
private string FieldLabel = "FilterField";
private string ValueLabel = "FilterValue";
// Step #4: Override EnsureInterfaces method and call RegisterInterface method.
// EnsureInterfaces() is called by the Web Part infrastructure
// during the ASP.NET PreRender event
// and allows the part to register all of its connection
// interfaces.
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 IFilterConsumer 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
// which appears in the UI</param>
// <param name="description">Description of the
// interface which 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 IFilterConsumer interface is allowed to connect
// across pages.</param>
RegisterInterface("MyFilterConsumerInterface", //InterfaceName
InterfaceTypes.IFilterConsumer, //InterfaceType
WebPart.LimitOneConnection, //MaxConnections
ConnectionRunAt.Server, //RunAtOptions
this, //InterfaceObject
"", //InterfaceClientReference
"Consume Filter From", //MenuLabel
"Consumes a Filter from another Web Part.", //Description
true); //allowCrossPageConnection
}
catch(SecurityException se)
{
_registrationErrorOccurred = true;
}
}
// Step #5: Override CanRunAt method.
// CanRunAt() 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 PartCommunicationConnect method.
// PartCommunicationConnect() 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 override void PartCommunicationConnect(string interfaceName,
WebPart connectedPart,
string connectedInterfaceName,
ConnectionRunAt runAt)
{
//Check if this is my particular Filter interface
if (interfaceName == "MyFilterConsumerInterface")
{
//Keep track of the Connection
_connected = true;
_connectedWebPartTitle = SPEncode.HtmlEncode(connectedPart.Title);
}
}
// Step #7: Override PartCommunicationInit method.
// PartCommunicationInit() is called by the Web Part
// infrastructure during the ASP.NET PreRender event
// to allow the part to pass initialization information to the
// other connected parts.
// It is important to always pass initialization information.
// Some parts may not behave properly if this initialization
// information is not received.
public override void PartCommunicationInit()
{
// If the connection wasn't actually formed then don't want
// to send Init event
if(_connected)
{
// Ensure that all of the Web Part's controls are
// created
// The _filterFieldNames and _filterFieldDisplayNames
// are set during EnsureChildControls()
EnsureChildControls();
// If there is a listener, fire the FilterConsumerInit
// event
if (FilterConsumerInit != null)
{
// Create the FilterConsumerInitEventArgs object
// for the FilterConsumerInit event.
FilterConsumerInitEventArgs filterConsumerInitArgs = new FilterConsumerInitEventArgs();
// Set the field names.
filterConsumerInitArgs.FieldList = _filterFieldNames;
filterConsumerInitArgs.FieldDisplayList = _filterFieldDisplayNames;
// Fire the FilterConsumerInit event.
FilterConsumerInit(this, filterConsumerInitArgs);
}
}
}
// Step #8: Override the GetInitEventArgs method.
// GetInitEventArgs() is called by the Web Part infrastructure
// during the ASP.NET PreRender event to gather the
// necessary information it needs to build the transformer
// dialog. The transformer dialog is needed when connecting
// different interfaces such as IRowProvider
// to ICellConsumer. The transformer dialog allows the user to
// map the fields between the interfaces. The
// GetInitEventArgs()method only needs to be implemented for
// interfaces that can participate in a transformer, which are
// the following:
// ICellConsumer, IRowProvider, IFilterConsumer,
// IParametersOutProvider, IParametersInConsumer.
// <param name="interfacename">Name of interface on which the
// Web Part infrastructure is requesting information</param>
// <returns>An InitEventArgs object</returns>
public override InitEventArgs GetInitEventArgs(string interfaceName)
{
// Check if this is my particular cell interface.
if (interfaceName == "MyFilterConsumerInterface")
{
// Ensure that all of the Web Part's controls are
// created.
//The _filterFieldNames and _filterFieldDisplayNames
// are set during EnsureChildControls()
EnsureChildControls();
// Create the FilterConsumerInitEventArgs object for
// the FilterConsumerInit event.
FilterConsumerInitEventArgs filterConsumerInitArgs = new FilterConsumerInitEventArgs();
// Set the field names
filterConsumerInitArgs.FieldList = _filterFieldNames;
filterConsumerInitArgs.FieldDisplayList = _filterFieldDisplayNames;
// return the FilterConsumerInitEventArgs.
return(filterConsumerInitArgs);
}
else
{
return(null);
}
}
// Step #9: Implement the SetFilter event handler.
// The connected provider part will call this method during its
// PartCommunicationMain phase
// to set the filter on the consumer Web Part.
// <param name="sender">Provider Web Part</param>
// <param name="SetFilterArgs">The args passed by the
// Provider</param>
public void SetFilter(object sender, SetFilterEventArgs setFilterEventArgs)
{
// Ensure that all of the Web Part's controls are created.
EnsureChildControls();
// Convert FilterExpression to the DataTable RowFilter
// syntax.
if(setFilterEventArgs.FilterExpression != null)
{
// Parse the filter information.
string[] values = setFilterEventArgs.FilterExpression.Split(new Char[] {'&'});
if (values.Length > 1)
{
int j = 1; //counts the number of Field/Value pairs
string filterField = string.Empty;
string filterValue = string.Empty;
string filterAnd = " AND ";
_rowFilterExpression = string.Empty;
for(int i=0; i < values.Length; i++)
{
// Clear values.
filterField = string.Empty;
filterValue = string.Empty;
// Create label portion of name/value pairs.
string currField, currValue;
currField = FieldLabel + j + "=";
currValue = ValueLabel + j + "=";
j++;
// Extract just the field name by replacing
// the rest of the string with string.Empty.
filterField = filterField + values[i].Replace(currField, string.Empty);
// Move to next item in the array which is
// the value component.
i++;
// Extract just the Value by replacing the
// rest of the string with string.Empty.
filterValue = filterValue + values[i].Replace(currValue, string.Empty);
// Contruct the row filter expression.
_rowFilterExpression += filterField + "=" + "'" + filterValue + "'" + filterAnd;
}
// Trim Off the trailing 'And'.
if (_rowFilterExpression.Length != 0)
_rowFilterExpression = _rowFilterExpression.Substring(0,_rowFilterExpression.Length - filterAnd.Length);
// Store _rowFilterExpression for use by
// NoFilter event.
_cachedRowFilter.Text = _rowFilterExpression;
}
}
}
// Step #10: Implement ClearFilter event handler.
// The connected provider part will call this method during
// its PartCommunicationMain phase
// to remove the filter on the consumer Web Part.
// <param name="sender">Provider Web Part</param>
// <param name="eventArgs">The Event Arguments</param>
public void ClearFilter(object sender, EventArgs eventArgs)
{
// Ensure that all of the Web Part's controls are created.
EnsureChildControls();
// Clear the filter on the DataTable.
_rowFilterExpression = string.Empty;
// Clear out the cached row filter expression.
_cachedRowFilter.Text = string.Empty;
}
// Step #11: Implement NoFilter event handler.
// The connected provider part will call this method during
// its PartCommunicationMain phase to indicate there is no
// change in the filter. This allows the consumer part to
// display its cached data instead of recalculating the
// filter expression or potentially hitting a database again.
// <param name="sender">Provider Web Part</param>
// <param name="eventArgs">The Event Arguments</param>
public void NoFilter(object sender, EventArgs eventArgs)
{
// Ensure that all of the Web Part's controls are created.
EnsureChildControls();
// No change in the filter so use cached _cachedRowFilter.
_rowFilterExpression = _cachedRowFilter.Text;
}
protected override void RenderWebPart(HtmlTextWriter output)
{
//Check for connection interface registration error
if (_registrationErrorOccurred)
{
output.Write(_registrationErrorMsg);
return;
}
// Ensure that all of the Web Part's controls are created.
EnsureChildControls();
// Row filter expression supplied by provider.
output.RenderBeginTag(HtmlTextWriterTag.B);
output.Write(_convertedRowFilterLabel + ": ");
output.RenderEndTag();
output.Write(_rowFilterExpression);
// Line break.
output.RenderBeginTag(HtmlTextWriterTag.Br);
output.RenderEndTag();
// Set filter.
((DataTable)_dataGrid.DataSource).DefaultView.RowFilter = _rowFilterExpression;
_dataGrid.DataBind();
// Render the DataGrid control.
_dataGrid.RenderControl(output);
//Line break.
output.RenderBeginTag(HtmlTextWriterTag.Br);
output.RenderEndTag();
// Hidden Row Filter TextBox stores _rowFilterExpression.
_cachedRowFilter.RenderControl(output);
// Check if connected.
if(_connected)
{
// Render connected Web Part title.
output.Write(_connectedWebPartLabel + ": ");
output.RenderBeginTag(HtmlTextWriterTag.I);
output.Write(_connectedWebPartTitle);
output.RenderEndTag();
output.Write("<br>");
}
else
{
// The Web Part isn't connected.
output.Write(_notConnectedMsg);
}
}
// Create Web Part user interface controls.
protected override void CreateChildControls()
{
// Create hidden textbox to store _rowFilterExpression.
_cachedRowFilter = new TextBox();
_cachedRowFilter.ID = "CachedRowFilter";
_cachedRowFilter.Visible = false;
Controls.Add(_cachedRowFilter);
// Create the DataGrid.
_dataGrid = new DataGrid();
_dataGrid.ID = "DataGrid";
// Create the DataTable.
DataTable dataTable = new DataTable();
// Add four column objects to the table.
DataColumn idColumn = new DataColumn();
idColumn.DataType = System.Type.GetType("System.Int32");
idColumn.ColumnName = "ID";
idColumn.Caption = "ID";
idColumn.AutoIncrement = true;
dataTable.Columns.Add(idColumn);
DataColumn Product = new DataColumn();
Product.DataType = System.Type.GetType("System.String");
Product.ColumnName = "Product";
Product.Caption = "Product";
dataTable.Columns.Add(Product);
DataColumn productCategory = new DataColumn();
productCategory.DataType = System.Type.GetType("System.String");
productCategory.ColumnName = "Category";
productCategory.Caption = "Category";
dataTable.Columns.Add(productCategory);
DataColumn Stock = new DataColumn();
Stock.DataType = System.Type.GetType("System.Int32");
Stock.ColumnName = "Stock";
Stock.Caption = "Stock";
dataTable.Columns.Add(Stock);
// Once a table has been created, use the NewRow method
// to create a DataRow.
DataRow dataRow;
// Add first row to collection.
dataRow = dataTable.NewRow();
dataRow["Product"] = "Aniseed Syrup";
dataRow["Category"] = "Condiments";
dataRow["Stock"] = 25;
dataTable.Rows.Add(dataRow);
// Add a second row.
dataRow = dataTable.NewRow();
dataRow["Product"] = "Vegie-spread";
dataRow["Category"] = "Condiments";
dataRow["Stock"] = 10;
dataTable.Rows.Add(dataRow);
//Add a third row.
dataRow = dataTable.NewRow();
dataRow["Product"] = "Outback Lager";
dataRow["Category"] = "Beverages";
dataRow["Stock"] = 30;
dataTable.Rows.Add(dataRow);
// Add a fourth row.
dataRow = dataTable.NewRow();
dataRow["Product"] = "Boston Crab Meat";
dataRow["Category"] = "Seafood";
dataRow["Stock"] = 10;
dataTable.Rows.Add(dataRow);
// Add a fifth row.
dataRow = dataTable.NewRow();
dataRow["Product"] = "Tofu";
dataRow["Category"] = "Produce";
dataRow["Stock"] = 41;
dataTable.Rows.Add(dataRow);
// Set the DataGrid's DataSource.
_dataGrid.DataSource = dataTable;
// Format the DataGrid.
_dataGrid.HeaderStyle.Font.Bold = true;
_dataGrid.HeaderStyle.ForeColor = Color.DarkBlue;
_dataGrid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
_dataGrid.AlternatingItemStyle.BackColor = Color.Beige;
_dataGrid.DataBind();
Controls.Add(_dataGrid);
// Set the DataTable field names.
//This information will be passed to the Provider Web Part
// when firing the FilterConsumerInit event.
int columnCount = dataTable.Columns.Count;
_filterFieldNames = new string[columnCount];
_filterFieldDisplayNames = new string[columnCount];
for(int i = 0; i < columnCount; i++)
{
_filterFieldNames[i] = dataTable.Columns[i].ColumnName;
_filterFieldDisplayNames[i] = dataTable.Columns[i].Caption;
}
}
}
}