如何:使用 Windows 窗体 BindingSource 绑定到 Web 服务
如果希望将 Windows 窗体控件绑定到通过调用 XML Web services 获取的结果,可以使用 BindingSource 组件。 此过程类似于将 BindingSource 组件绑定到类型。 您必须创建一个客户端代理,其中包含由 Web 服务公开的方法和类型。 客户端代理可以由 Web 服务 (.asmx) 本身或其 Web 服务描述语言 (WSDL) 文件生成。 另外,客户端代理必须将 Web 服务使用的复杂类型的字段作为公共属性公开。 然后将 BindingSource 绑定到在 Web 服务代理中公开的一种类型。
创建和绑定到客户端代理
在所选择的目录中以适当的命名空间创建 Windows 窗体。
将一个 BindingSource 组件添加到窗体中。
打开 Windows 软件开发包 (SDK) 命令提示符,并定位到窗体所在的目录。
使用 WSDL 工具为 Web 服务的 .asmx 或 WSDL 文件输入 wsdl 和 URL,然后输入应用程序的命名空间,也可以选择输入所使用的语言。
下面的代码示例使用位于 http://webservices.eraserver. net/zipcoderesolver/zipcoderesolver.asmx 位置的 Web 服务。 例如,适用于 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,则将文件添加到项目中。
在客户端代理中选择要绑定到的类型。
它通常是由 Web 服务提供的方法返回的类型。 为了进行绑定,所选择类型的字段必须公开为公共属性。
<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; } } };
将 BindingSource 的 DataSource 属性设置为 Web 服务客户端代理中包含的所需类型。
BindingSource1.DataSource = GetType(USPSAddress)
BindingSource1.DataSource = typeof(USPSAddress);
BindingSource1->DataSource = USPSAddress::typeid;
将控件绑定到 BindingSource(已绑定到 Web 服务)
通过将所需的 Web 服务类型的公共属性作为参数进行传递,将控件绑定到 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);
示例
下面的代码示例演示如何将一个 BindingSource 组件绑定到 Web 服务,然后将一个文本框绑定到 BindingSource 组件。 当您单击该按钮时,将调用一个 Web 服务方法,结果显示在 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 中生成此示例。 有关更多信息,请参见 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例 和 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例 和 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例 和 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例 和 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例.