다음을 통해 공유


방법: Windows Forms BindingSource를 사용하여 웹 서비스에 바인딩

업데이트: 2007년 11월

XML Web services를 호출하여 얻은 결과에 Windows Form 컨트롤을 바인딩하려는 경우 BindingSource 구성 요소를 사용하면 됩니다. 이 절차는 형식에 BindingSource 구성 요소를 바인딩하는 절차와 비슷합니다. Web services에서 노출되는 형식과 메서드를 포함하는 클라이언트측 프록시를 만들어야 합니다. 클라이언트측 프록시는 Web services(.asmx) 자체나 해당 WSDL(웹 서비스 설명 언어) 파일을 통해 생성합니다. 또한 클라이언트측 프록시에서는 Web services에서 사용되는 복잡한 형식의 필드를 공용 속성으로 노출해야 합니다. 그런 다음 Web services 프록시에서 노출되는 형식 중 하나로 BindingSource를 바인딩합니다.

Windows Form 컨트롤을 만들어 클라이언트측 프록시에 바인딩하려면

  1. 선택한 디렉터리에 적절한 네임스페이스를 사용하여 Windows Form을 만듭니다.

  2. BindingSource 구성 요소를 폼에 추가합니다.

  3. Windows SDK(소프트웨어 개발 키트) 명령 프롬프트를 열고 폼이 있는 디렉터리로 이동합니다.

  4. wsdl을 입력한 다음 Web services에 대한 WSDL 파일 또는 .asmx의 URL과 응용 프로그램의 네임스페이스 및 사용 중인 언어(옵션)를 입력합니다.

    다음 코드 예제에서는 http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx에 있는 Web services를 사용합니다. 예를 들어, C#의 경우 wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService를 입력하고 Visual Basic의 경우 wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService /language:VB를 입력합니다. 경로를 WSDL 도구에 인수로 전달하면 사용 중인 응용 프로그램과 동일한 디렉터리 및 네임스페이스에 지정된 언어로 클라이언트측 프록시가 생성됩니다. 현재 Visual Studio를 사용 중이면 파일을 프로젝트에 추가합니다.

  5. 바인딩할 클라이언트측 프록시에서 형식을 선택합니다.

    일반적으로 이 형식은 Web services가 제공하는 메서드에서 반환되는 형식입니다. 선택한 형식의 필드는 바인딩을 위해 공용 속성으로 노출되어야 합니다.

    <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
    
     [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 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;
                }
            }
        };
    
  6. BindingSourceDataSource 속성을 Web services 클라이언트측 프록시에 포함된 형식 중 원하는 형식으로 설정합니다.

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

Web services에 바인딩된 BindingSource에 컨트롤을 바인딩하려면

  • Web services 형식의 원하는 공용 속성을 매개 변수로 전달하여 BindingSource에 컨트롤을 바인딩합니다.

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

예제

다음 코드 예제에서는 Web services에 BindingSource 구성 요소를 바인딩한 다음 BindingSource 구성 요소에 텍스트 상자를 바인딩하는 방법을 보여 줍니다. 단추를 클릭하면 Web services 메서드가 호출되고 textbox1에 결과가 표시됩니다.

Imports System
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
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]);
            }
        }
    }
 }
#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;
}

코드 컴파일

이 예제는 Main 메서드가 들어 있는 완전한 예제이며 클라이언트측 프록시 코드의 약식 버전입니다.

이 예제에는 다음 사항이 필요합니다.

  • System, System.Drawing, System.Web.Services, System.Windows.Forms 및 System.Xml 어셈블리에 대한 참조

Visual Basic 또는 Visual C#의 명령줄에서 이 예제를 빌드하는 방법에 대한 자세한 내용은 명령줄에서 빌드(Visual Basic) 또는 csc.exe를 사용한 명령줄 빌드를 참조하십시오. Visual Studio에서 코드를 새 프로젝트에 붙여넣어 이 예제를 빌드할 수도 있습니다.

참고 항목

작업

방법: 형식에 Windows Forms 컨트롤 바인딩

기타 리소스

BindingSource 구성 요소