Compartilhar via


Como associar a um serviço Web usando o BindingSource do Windows Forms

Se você quiser associar um controle do Windows Form aos resultados obtidos ao chamar um serviço Web XML, poderá usar um componente BindingSource. Este procedimento é semelhante à associação de um componente BindingSource a um tipo. Você deve criar um proxy do lado do cliente que contenha os métodos e tipos expostos pelo serviço Web. Você gera um proxy do lado do cliente a partir do próprio serviço Web (.asmx) ou de seu arquivo WSDL (Linguagem de Descrição dos Serviços Web). Além disso, o proxy do lado do cliente deve expor os campos de tipos complexos usados pelo serviço Web como propriedades públicas. Em seguida, você associa o BindingSource a um dos tipos expostos no proxy do serviço Web.

Para criar e associar a um proxy do lado do cliente

  1. Crie um Formulário do Windows no diretório de sua escolha, com um namespace apropriado.

  2. Adicione um componente BindingSource ao formulário.

  3. Abra o prompt de comando do SDK (Software Development Kit) do Windows e navegue até o mesmo diretório no qual seu formulário está localizado.

  4. Usando a ferramenta WSDL, insira wsdl e a URL do arquivo .asmx ou WSDL para o serviço Web, seguido pelo namespace do aplicativo e, opcionalmente, o idioma em que você está trabalhando.

    O exemplo de código a seguir usa o serviço Web localizado em http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx. Por exemplo, para o tipo C# wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebServiceou para o tipo do Visual Basic wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService /language:VB. Passar o caminho como um argumento para a ferramenta WSDL gerará um proxy do lado do cliente no mesmo diretório e namespace que seu aplicativo, no idioma especificado. Se você estiver usando o Visual Studio, adicione o arquivo ao seu projeto.

  5. Selecione um tipo no proxy do lado do cliente ao qual associar.

    Normalmente, esse é um tipo retornado por um método oferecido pelo serviço Web. Os campos do tipo escolhido devem ser expostos como propriedades públicas para fins de vinculação.

        [System::SerializableAttribute, System::Xml::Serialization::XmlTypeAttribute(
            Namespace="http://webservices.eraserver.net/")]
        public ref class USPSAddress
        {
    
    private:
            String^ streetField;
    
            String^ cityField;
    
            String^ stateField;
    
            String^ shortZIPField;
    
            String^ fullZIPField;
    
    
    public:
            property String^ Street    
            {
                String^ get()
                {
                    return this->streetField;
                }
                void set( String^ value )
                {
                    this->streetField = value;
                }
            }
    
    
            property String^ City    
            {
                String^ get()
                {
                    return this->cityField;
                }
                void set( String^ value )
                {
                    this->cityField = value;
                }
            }
            property String^ State    
            {
                String^ get()
                {
                    return this->stateField;
                }
                void set( String^ value )
                {
                    this->stateField = value;
                }
            }
    
            property String^ ShortZIP    
            {
                String^ get()
                {
                    return this->shortZIPField;
                }
                void set( String^ value )
                {
                    this->shortZIPField = value;
                }
            }
    
            property String^ FullZIP    
            {
                String^ get()
                {
                    return this->fullZIPField;
                }
                void set( String^ value )
                {
                    this->fullZIPField = value;
                }
            }
        };
    
    [System.SerializableAttribute, System.Xml.Serialization.XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public class USPSAddress
    {
    
        private string streetField;
    
        private string cityField;
    
        private string stateField;
    
        private string shortZIPField;
    
        private string fullZIPField;
    
        public string Street
        {
            get
            {
                return this.streetField;
            }
            set
            {
                this.streetField = value;
            }
        }
    
        public string City
        {
            get
            {
                return this.cityField;
            }
            set
            {
                this.cityField = value;
            }
        }
    
        public string State
        {
            get
            {
                return this.stateField;
            }
            set
            {
                this.stateField = value;
            }
        }
    
        public string ShortZIP
        {
            get
            {
                return this.shortZIPField;
            }
            set
            {
                this.shortZIPField = value;
            }
        }
    
        public string FullZIP
        {
            get
            {
                return this.fullZIPField;
            }
            set
            {
                this.fullZIPField = value;
            }
        }
    }
    
    <System.SerializableAttribute(), _
     System.Xml.Serialization.XmlTypeAttribute( _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class USPSAddress
    
        Private streetField As String
    
        Private cityField As String
    
        Private stateField As String
    
        Private shortZIPField As String
    
        Private fullZIPField As String
    
    
        Public Property Street() As String
            Get
                Return Me.streetField
            End Get
            Set(ByVal value As String)
                Me.streetField = value
            End Set
        End Property
    
    
        Public Property City() As String
            Get
                Return Me.cityField
            End Get
            Set(ByVal value As String)
                Me.cityField = value
            End Set
        End Property
    
        Public Property State() As String
            Get
                Return Me.stateField
            End Get
            Set(ByVal value As String)
                Me.stateField = value
            End Set
        End Property
    
    
        Public Property ShortZIP() As String
            Get
                Return Me.shortZIPField
            End Get
            Set(ByVal value As String)
                Me.shortZIPField = value
            End Set
        End Property
    
    
        Public Property FullZIP() As String
            Get
                Return Me.fullZIPField
            End Get
            Set(ByVal value As String)
                Me.fullZIPField = value
            End Set
        End Property
    End Class
    
  6. Defina a propriedade DataSource do BindingSource para o tipo desejado contido no proxy do lado do cliente do serviço Web.

    BindingSource1->DataSource = USPSAddress::typeid;
    
    BindingSource1.DataSource = typeof(USPSAddress);
    
    BindingSource1.DataSource = GetType(USPSAddress)
    

Para associar controles ao BindingSource associado a um serviço Web

  • Associe controles à BindingSource, passando a propriedade pública do tipo de serviço Web que você deseja como parâmetro.

    textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
    
    textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
    
    textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
    

Exemplo

O exemplo de código a seguir demonstra como associar um componente BindingSource a um serviço Web e, em seguida, como associar uma caixa de texto ao componente BindingSource. Quando você clica no botão, um método de serviço Web é chamado e os resultados serão exibidos em textbox1.

#using <System.Windows.Forms.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Web.Services.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Collections::Generic;
using namespace System::ComponentModel;
using namespace System::Drawing;
using namespace System::Windows::Forms;
 
namespace BindToWebService {

    [System::SerializableAttribute, System::Xml::Serialization::XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public ref class USPSAddress
    {

private:
        String^ streetField;

        String^ cityField;

        String^ stateField;

        String^ shortZIPField;

        String^ fullZIPField;


public:
        property String^ Street    
        {
            String^ get()
            {
                return this->streetField;
            }
            void set( String^ value )
            {
                this->streetField = value;
            }
        }


        property String^ City    
        {
            String^ get()
            {
                return this->cityField;
            }
            void set( String^ value )
            {
                this->cityField = value;
            }
        }
        property String^ State    
        {
            String^ get()
            {
                return this->stateField;
            }
            void set( String^ value )
            {
                this->stateField = value;
            }
        }

        property String^ ShortZIP    
        {
            String^ get()
            {
                return this->shortZIPField;
            }
            void set( String^ value )
            {
                this->shortZIPField = value;
            }
        }

        property String^ FullZIP    
        {
            String^ get()
            {
                return this->fullZIPField;
            }
            void set( String^ value )
            {
                this->fullZIPField = value;
            }
        }
    };


    [System::Web::Services::WebServiceBindingAttribute(Name="ZipCodeResolverSoap",
        Namespace="http://webservices.eraserver.net/")]
    public ref class ZipCodeResolver:
        public System::Web::Services::Protocols::SoapHttpClientProtocol

    {
        
public:
        ZipCodeResolver() : SoapHttpClientProtocol()
        {        
            this->Url = 
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx";
        }

    
        //''<remarks/>
        [System::Web::Services::Protocols::SoapDocumentMethodAttribute
            ("http://webservices.eraserver.net/CorrectedAddressXml", 
            RequestNamespace="http://webservices.eraserver.net/", 
            ResponseNamespace="http://webservices.eraserver.net/", 
            Use=System::Web::Services::Description::SoapBindingUse::Literal, 
            ParameterStyle=System::Web::Services::Protocols::SoapParameterStyle::Wrapped)]
        USPSAddress^ CorrectedAddressXml(String^ accessCode, 
            String^ address, String^ city, String^ state)
        {
            array<Object^>^ results = this->Invoke("CorrectedAddressXml", 
                gcnew array<Object^>{accessCode, address, city, state});
            return ((USPSAddress^) results[0]);
        }

        //''<remarks/>
        System::IAsyncResult^ BeginCorrectedAddressXml(String^ accessCode,
            String^ address, String^ city, String^ state, 
            System::AsyncCallback^ callback, Object^ asyncState)
        {

            return this->BeginInvoke("CorrectedAddressXml", 
                gcnew array<Object^>{accessCode, address, city, state}, callback, asyncState);
        }


        USPSAddress^ EndCorrectedAddressXml(System::IAsyncResult^ asyncResult)
        {
            array<Object^>^ results = this->EndInvoke(asyncResult);
            return ((USPSAddress^) results[0]);
        }

    };

    ref class Form1: public Form
    {
public:
        [STAThread]
        static void Main()
        {
            Application::EnableVisualStyles();
            Application::Run(gcnew Form1());
        }

private:
        BindingSource^ BindingSource1;

        TextBox^ textBox1;

        TextBox^ textBox2;

        Button^ button1;


public:
        Form1()
        {
            this->Load += gcnew EventHandler(this, &Form1::Form1_Load);
            textBox1->Location = System::Drawing::Point(118, 131);
            textBox1->ReadOnly = true;
            button1->Location = System::Drawing::Point(133, 60);
            button1->Click += gcnew EventHandler(this, &Form1::button1_Click);
            button1->Text = "Get zipcode";
            ClientSize = System::Drawing::Size(292, 266);
            Controls->Add(this->button1);
            Controls->Add(this->textBox1);
                        BindingSource1 = gcnew BindingSource();
                        textBox1 = gcnew TextBox();
                        textBox2 = gcnew TextBox();
                        button1 = gcnew Button();
        }

private:
        void button1_Click(Object^ sender, EventArgs^ e)
        {
            textBox1->Text = "Calling Web service..";
            ZipCodeResolver^ resolver = gcnew ZipCodeResolver();
            BindingSource1->Add(resolver->CorrectedAddressXml("0",
                    "One Microsoft Way", "Redmond", "WA"));
                        
        }

public:
        void Form1_Load(Object^ sender, EventArgs^ e)
        {
            BindingSource1->DataSource = USPSAddress::typeid;
            textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
        }
    };




    public ref class CorrectedAddressXmlCompletedEventArgs:
    public System::ComponentModel::AsyncCompletedEventArgs

    {
private:
        array<Object^>^ results;

internal:
        CorrectedAddressXmlCompletedEventArgs(array<Object^>^ results,
            System::Exception^ exception, bool cancelled, Object^ userState) :
            AsyncCompletedEventArgs(exception, cancelled, userState)
        {        
            this->results = results;
        }


public:
        property USPSAddress^ Result    
        {
            USPSAddress^ get()
            {
                this->RaiseExceptionIfNecessary();
                return ((USPSAddress^) this->results[0]);
            }
        }

     delegate void CorrectedAddressXmlCompletedEventHandler(Object^ sender,
        CorrectedAddressXmlCompletedEventArgs^ args);

    };
}

int main()
{
    BindToWebService::Form1::Main();
    return 1;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace BindToWebService {
    class Form1: Form

    {
        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

        private BindingSource BindingSource1 = new BindingSource();
        private TextBox textBox1 = new TextBox();
        private TextBox textBox2 = new TextBox();
        private Button button1 = new Button();

        public Form1()
        {
            this.Load += new EventHandler(Form1_Load);
            textBox1.Location = new System.Drawing.Point(118, 131);
            textBox1.ReadOnly = true;
            button1.Location = new System.Drawing.Point(133, 60);
            button1.Click += new EventHandler(button1_Click);
            button1.Text = "Get zipcode";
            ClientSize = new System.Drawing.Size(292, 266);
            Controls.Add(this.button1);
            Controls.Add(this.textBox1);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            textBox1.Text = "Calling Web service..";
            ZipCodeResolver resolver = new ZipCodeResolver();
            BindingSource1.Add(resolver.CorrectedAddressXml("0",
                    "One Microsoft Way", "Redmond", "WA"));
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            BindingSource1.DataSource = typeof(USPSAddress);
            textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
        }
    }

    [System.Web.Services.WebServiceBindingAttribute(Name="ZipCodeResolverSoap",
        Namespace="http://webservices.eraserver.net/")]
    public class ZipCodeResolver:
        System.Web.Services.Protocols.SoapHttpClientProtocol

    {
        
        public ZipCodeResolver() : base()
        {
            this.Url =
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx";
        }

        //''<remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute
            ("http://webservices.eraserver.net/CorrectedAddressXml",
            RequestNamespace="http://webservices.eraserver.net/",
            ResponseNamespace="http://webservices.eraserver.net/",
            Use=System.Web.Services.Description.SoapBindingUse.Literal,
            ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        public USPSAddress CorrectedAddressXml(string accessCode,
            string address, string city, string state)
        {
            object[] results = this.Invoke("CorrectedAddressXml",
                new object[]{accessCode, address, city, state});
            return ((USPSAddress) results[0]);
        }

        //''<remarks/>
        public System.IAsyncResult BeginCorrectedAddressXml(string accessCode,
            string address, string city, string state,
            System.AsyncCallback callback, object asyncState)
        {

            return this.BeginInvoke("CorrectedAddressXml",
                new object[]{accessCode, address, city, state}, callback, asyncState);
        }

        public USPSAddress EndCorrectedAddressXml(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((USPSAddress) results[0]);
        }
    }

    [System.SerializableAttribute, System.Xml.Serialization.XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public class USPSAddress
    {

        private string streetField;

        private string cityField;

        private string stateField;

        private string shortZIPField;

        private string fullZIPField;

        public string Street
        {
            get
            {
                return this.streetField;
            }
            set
            {
                this.streetField = value;
            }
        }

        public string City
        {
            get
            {
                return this.cityField;
            }
            set
            {
                this.cityField = value;
            }
        }

        public string State
        {
            get
            {
                return this.stateField;
            }
            set
            {
                this.stateField = value;
            }
        }

        public string ShortZIP
        {
            get
            {
                return this.shortZIPField;
            }
            set
            {
                this.shortZIPField = value;
            }
        }

        public string FullZIP
        {
            get
            {
                return this.fullZIPField;
            }
            set
            {
                this.fullZIPField = value;
            }
        }
    }

    public delegate void CorrectedAddressXmlCompletedEventHandler(object sender,
        CorrectedAddressXmlCompletedEventArgs args);

    public class CorrectedAddressXmlCompletedEventArgs:
    System.ComponentModel.AsyncCompletedEventArgs

    {
        private object[] results;

        internal CorrectedAddressXmlCompletedEventArgs(object[] results,
            System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        public USPSAddress Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((USPSAddress) this.results[0]);
            }
        }
    }
 }
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms

Namespace BindToWebService
    Class Form1
        Inherits Form

        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub

        Private BindingSource1 As New BindingSource()
        Private textBox1 As New TextBox()
        Private textBox2 As New TextBox()
        Private WithEvents button1 As New Button()

        Public Sub New()

            textBox1.Location = New System.Drawing.Point(118, 131)
            textBox1.ReadOnly = True
            button1.Location = New System.Drawing.Point(133, 60)
            button1.Text = "Get zipcode"
            ClientSize = New System.Drawing.Size(292, 266)
            Controls.Add(Me.button1)
            Controls.Add(Me.textBox1)
        End Sub

        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
            Handles button1.Click

            textBox1.Text = "Calling Web service.."
            Dim resolver As New ZipCodeResolver()
            BindingSource1.Add(resolver.CorrectedAddressXml("0", "One Microsoft Way", "Redmond", "WA"))

        End Sub


        Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
            BindingSource1.DataSource = GetType(USPSAddress)
            textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
        End Sub

    End Class

    <System.Diagnostics.DebuggerStepThroughAttribute(), _
     System.ComponentModel.DesignerCategoryAttribute("code"), _
     System.Web.Services.WebServiceBindingAttribute(Name:="ZipCodeResolverSoap", _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class ZipCodeResolver
        Inherits System.Web.Services.Protocols.SoapHttpClientProtocol

        Private CorrectedAddressXmlOperationCompleted As _
            System.Threading.SendOrPostCallback


        Public Sub New()
            MyBase.New()
            Me.Url = _
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx"
        End Sub


        Public Event CorrectedAddressXmlCompleted As _
            CorrectedAddressXmlCompletedEventHandler

        <System.Web.Services.Protocols.SoapDocumentMethodAttribute( _
            "http://webservices.eraserver.net/CorrectedAddressXml", _
            RequestNamespace:="http://webservices.eraserver.net/", _
            ResponseNamespace:="http://webservices.eraserver.net/", _
            Use:=System.Web.Services.Description.SoapBindingUse.Literal, _
            ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)> _
        Public Function CorrectedAddressXml(ByVal accessCode As String, _
            ByVal address As String, ByVal city As String, ByVal state As String) _
            As USPSAddress
            Dim results() As Object = Me.Invoke("CorrectedAddressXml", _
                New Object() {accessCode, address, city, state})
            Return CType(results(0), USPSAddress)
        End Function

        '''<remarks/>
        Public Function BeginCorrectedAddressXml(ByVal accessCode As String, _
            ByVal address As String, ByVal city As String, ByVal state As String, _
            ByVal callback As System.AsyncCallback, ByVal asyncState As Object) _
            As System.IAsyncResult

            Return Me.BeginInvoke("CorrectedAddressXml", _
                New Object() {accessCode, address, city, state}, callback, asyncState)
        End Function

        Public Function EndCorrectedAddressXml(ByVal asyncResult _
            As System.IAsyncResult) As USPSAddress
            Dim results() As Object = Me.EndInvoke(asyncResult)
            Return CType(results(0), USPSAddress)
        End Function
    End Class

    <System.SerializableAttribute(), _
     System.Xml.Serialization.XmlTypeAttribute( _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class USPSAddress

        Private streetField As String

        Private cityField As String

        Private stateField As String

        Private shortZIPField As String

        Private fullZIPField As String


        Public Property Street() As String
            Get
                Return Me.streetField
            End Get
            Set(ByVal value As String)
                Me.streetField = value
            End Set
        End Property


        Public Property City() As String
            Get
                Return Me.cityField
            End Get
            Set(ByVal value As String)
                Me.cityField = value
            End Set
        End Property

        Public Property State() As String
            Get
                Return Me.stateField
            End Get
            Set(ByVal value As String)
                Me.stateField = value
            End Set
        End Property


        Public Property ShortZIP() As String
            Get
                Return Me.shortZIPField
            End Get
            Set(ByVal value As String)
                Me.shortZIPField = value
            End Set
        End Property


        Public Property FullZIP() As String
            Get
                Return Me.fullZIPField
            End Get
            Set(ByVal value As String)
                Me.fullZIPField = value
            End Set
        End Property
    End Class

    Public Delegate Sub CorrectedAddressXmlCompletedEventHandler(ByVal sender As Object, _
         ByVal args As CorrectedAddressXmlCompletedEventArgs)

    Public Class CorrectedAddressXmlCompletedEventArgs
        Inherits System.ComponentModel.AsyncCompletedEventArgs

        Private results() As Object

        Friend Sub New(ByVal results() As Object, ByVal exception As System.Exception, _
            ByVal cancelled As Boolean, ByVal userState As Object)
            MyBase.New(exception, cancelled, userState)
            Me.results = results
        End Sub

        Public ReadOnly Property Result() As USPSAddress
            Get
                Me.RaiseExceptionIfNecessary()
                Return CType(Me.results(0), USPSAddress)
            End Get
        End Property
    End Class

End Namespace

Compilando o código

Este é um exemplo completo que inclui um método Main e uma versão abreviada do código proxy do lado do cliente.

Este exemplo requer:

  • Referências aos assemblies System, System.Drawing, System.Web.Services, System.Windows.Forms e System.Xml.

Consulte também