Partilhar via


TableCallback Delegar

Definição

Faz referência ao método a ser chamado ao recuperar dados de tabela de um provedor.

public delegate void TableCallback(ICollection ^ tableData);
public delegate void TableCallback(ICollection tableData);
type TableCallback = delegate of ICollection -> unit
Public Delegate Sub TableCallback(tableData As ICollection)

Parâmetros

tableData
ICollection

Os dados a serem recuperados do provedor.

Exemplos

O exemplo de código a seguir contém um controle Web Parts nomeado TableProviderWebPart que serve como um provedor de dados na forma de uma tabela. O controle inclui uma implementação do GetTableData método, que recebe um parâmetro do tipo TableCallback. Esse método chama o método representado pelo TableCallback delegado que passa os dados da tabela.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Reflection;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
//This sample code creates a Web Parts control that acts as a provider of table data.
namespace Samples.AspNet.CS.Controls
{
    public sealed class TableProviderWebPart : WebPart, IWebPartTable
    {
        DataTable _table;

        public TableProviderWebPart()
        {
            _table = new DataTable();

            DataColumn col = new DataColumn();
            col.DataType = typeof(string);
            col.ColumnName = "Name";
            _table.Columns.Add(col);

            col = new DataColumn();
            col.DataType = typeof(string);
            col.ColumnName = "Address";
            _table.Columns.Add(col);

            col = new DataColumn();
            col.DataType = typeof(int);
            col.ColumnName = "ZIP Code";
            _table.Columns.Add(col);

            DataRow row = _table.NewRow();
            row["Name"] = "John Q. Public";
            row["Address"] = "123 Main Street";
            row["ZIP Code"] = 98000;
            _table.Rows.Add(row);
        }

        public PropertyDescriptorCollection Schema
        {
            get
            {
                return TypeDescriptor.GetProperties(_table.DefaultView[0]);
            }
        }
        
        public void GetTableData(TableCallback callback)
        {
            callback(_table.Rows);
        }

        public bool ConnectionPointEnabled
        {
            get
            {
                object o = ViewState["ConnectionPointEnabled"];
                return (o != null) ? (bool)o : true;
            }
            set
            {
                ViewState["ConnectionPointEnabled"] = value;
            }
        }

        [ConnectionProvider("Table")]
        public IWebPartTable GetConnectionInterface()
        {
            return new TableProviderWebPart();
        }

        public class TableProviderConnectionPoint : ProviderConnectionPoint
        {
            public TableProviderConnectionPoint(MethodInfo callbackMethod, 
                Type interfaceType, Type controlType,
                string name, string id, bool allowsMultipleConnections)
                : base(callbackMethod, interfaceType, controlType,
                    name, id, allowsMultipleConnections)
            {
            }

            public override bool GetEnabled(Control control)
            {
                return ((TableProviderWebPart)control).ConnectionPointEnabled;
            }
        }
    }
}
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Reflection
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

'This sample code creates a Web Parts control that acts as a provider of table data.
Namespace Samples.AspNet.VB.Controls

    Public NotInheritable Class TableProviderWebPart
        Inherits WebPart
        Implements IWebPartTable

        Private _table As DataTable


        Public Sub New()
            _table = New DataTable()

            Dim col As New DataColumn()
            col.DataType = GetType(String)
            col.ColumnName = "Name"
            _table.Columns.Add(col)

            col = New DataColumn()
            col.DataType = GetType(String)
            col.ColumnName = "Address"
            _table.Columns.Add(col)

            col = New DataColumn()
            col.DataType = GetType(Integer)
            col.ColumnName = "ZIP Code"
            _table.Columns.Add(col)

            Dim row As DataRow = _table.NewRow()
            row("Name") = "John Q. Public"
            row("Address") = "123 Main Street"
            row("ZIP Code") = 98000
            _table.Rows.Add(row)

        End Sub

        <ConnectionProvider("Table")> _
        Public Function GetConnectionInterface() As IWebPartTable
            Return New TableProviderWebPart()

        End Function 'GetConnectionInterface

        Public ReadOnly Property Schema() As PropertyDescriptorCollection _
            Implements IWebPartTable.Schema
            Get
                Return TypeDescriptor.GetProperties(_table.DefaultView(0))
            End Get
        End Property

        Public Property ConnectionPointEnabled() As Boolean
            Get
                Dim o As Object
                o = ViewState("ConnectionPointEnabled")
                If Not (o Is Nothing) Then
                    Return CBool(o)
                Else
                    Return True
                End If

            End Get
            Set(ByVal value As Boolean)
                ViewState("ConnectionPointEnabled") = value
            End Set
        End Property

        Public Sub GetTableData(ByVal callback As TableCallback) _
            Implements IWebPartTable.GetTableData
            callback(_table.Rows)

        End Sub
    End Class

End Namespace

OnPreRender No método, o consumidor chama GetTableData TableProviderWebPart e passa seu GetTableData método como delegado para chamar com os dados da tabela, conforme mostrado no exemplo de código a seguir.

namespace Samples.AspNet.CS.Controls
{
    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Reflection;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Collections;

    public class TableConsumer : WebPart
    {
        private IWebPartTable _provider;
        private ICollection _tableData;

        private void GetTableData(object tableData)
        {
            _tableData = (ICollection)tableData;
        }

        protected override void OnPreRender(EventArgs e)
        {
            if (_provider != null)
            {
                _provider.GetTableData(new TableCallback(GetTableData));
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            if (_provider != null)
            {
                PropertyDescriptorCollection props = _provider.Schema;
                int count = 0;
                if (props != null && props.Count > 0 && _tableData != null)
                {
                    foreach (PropertyDescriptor prop in props)
                    {
                        foreach (DataRow o in _tableData)
                        {
                            writer.Write(prop.DisplayName + ": " + o[count]);
                        }
                        writer.WriteBreak();
                        writer.WriteLine();
                        count = count + 1;
                    }
                }
                else
                {
                    writer.Write("No data");
                }
            }
            else
            {
                writer.Write("Not connected");
            }
        }

        [ConnectionConsumer("Table")]
        public void SetConnectionInterface(IWebPartTable provider)
        {
            _provider = provider;
        }
    }
}
Imports System.ComponentModel
Imports System.Reflection
Imports System.Collections
Imports System.Data
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

    Public Class TableConsumerWebPart
        Inherits WebPart

        Private _provider As IWebPartTable
        Private _tableData As ICollection

        Private Sub GetTableData(ByVal tableData As ICollection)
            _tableData = CType(tableData, ICollection)

        End Sub

        Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
            If Not (_provider Is Nothing) Then
                _provider.GetTableData((New TableCallback(AddressOf GetTableData)))
            End If
            'MyBase.OnPreRender(e)

        End Sub

        Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)

            If Not (_provider Is Nothing) Then
                Dim props As PropertyDescriptorCollection = _provider.Schema
                Dim count As Integer = 0

                If Not (props Is Nothing) AndAlso props.Count > 0 _
                  AndAlso Not (_tableData Is Nothing) Then
                    For Each prop As PropertyDescriptor In props
                        For Each o As DataRow In _tableData
                            writer.Write(prop.DisplayName & ": " & o(count).ToString())
                        Next
                        writer.WriteBreak()
                        writer.WriteLine()
                        count = count + 1
                    Next
                Else
                    writer.Write("No data")
                End If
            Else
                writer.Write("Not connected")
            End If

        End Sub

        <ConnectionConsumer("Table")> _
        Public Sub SetConnectionInterface(ByVal provider As IWebPartTable)
            _provider = provider

        End Sub

        Private Class TableConsumerConnectionPoint
            Inherits ConsumerConnectionPoint

            Public Sub New(ByVal callbackMethod As MethodInfo, _
              ByVal interfaceType As Type, ByVal controlType As Type, _
              ByVal name As String, ByVal id As String, _
              ByVal allowsMultipleConnections As Boolean)
                MyBase.New(callbackMethod, interfaceType, controlType, _
                  name, id, allowsMultipleConnections)

            End Sub
        End Class
    End Class

End Namespace

Os dois controles e a conexão são incluídos em uma página da Web, conforme mostrado no exemplo a seguir.

<%@ page language="C#" %>
<%@ Register tagprefix="wp" Namespace="Samples.AspNet.CS.Controls"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>ITable Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <!-- A static or dynamic connection is required to link two
             Web Parts controls. --->
        <asp:webpartmanager id="WebPartManager1" runat="server">
            <StaticConnections>
                <asp:WebPartConnection id="wp1" ProviderID="provider1" 
                   ConsumerID="consumer1">
                </asp:WebPartConnection>
            </StaticConnections>
        </asp:webpartmanager>
        <asp:webpartzone id="WebPartZone1" runat="server">
            <zoneTemplate>
            <!-- The following two lines define the 
              two connected controls. --->
            <wp:TableProviderWebPart ID="provider1" runat="server" 
               title="Web Parts Table Provider Control" />
            <wp:TableConsumer ID="consumer1" runat="server" 
               title="Web Parts Table Consumer Control"/>
            </zoneTemplate>
        </asp:webpartzone>
    </div>
    </form>
</body>
</html>
<%@ Page Language="VB" %>
<%@ Register tagprefix="wp" Namespace="Samples.AspNet.VB.Controls"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>ITable Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <!-- A static or dynamic connection is required to 
             link two Web Parts controls. --->
        <asp:webpartmanager id="WebPartManager1" runat="server">
            <StaticConnections>
                <asp:WebPartConnection id="wp1" ProviderID="provider1" 
                   ConsumerID="consumer1">
                </asp:WebPartConnection>
            </StaticConnections>
        </asp:webpartmanager>
        <asp:webpartzone id="WebPartZone1" runat="server">
            <zoneTemplate>
            <!-- The following two lines define the two 
                 connected controls. --->
            <wp:TableProviderWebPart ID="provider1" runat="server" 
               title="Web Parts Table Provider Control" />
            <wp:TableConsumerWebPart ID="consumer1" runat="server" 
               title="Web Parts Table Consumer Control"/>
            </zoneTemplate>
        </asp:webpartzone>
    </div>
    </form>
</body>
</html>

Comentários

Quando um controle Web Parts implementa a IWebPartTable interface e serve como um provedor em uma conexão Web Parts, o consumidor ou transformador deve recuperar e processar os dados da tabela do provedor. O TableCallback delegado representa o método a ser chamado para processar os dados do provedor.

O GetTableData método contém um TableCallback parâmetro delegado.

Métodos de Extensão

GetMethodInfo(Delegate)

Obtém um objeto que representa o método representado pelo delegado especificado.

Aplica-se a