帮酷LOGO
0 0 评论
文章标签:控制  TRAC  custom-control  Stock  

介绍

本文描述了一个定制控件的构造,该控件用于检查通过 public web服务提供的股票价格。 本文包括这个定制控件的源代码以及用于测试控件的演示站点。

图 1: 正在使用的库存跟踪器自定义控件

入门

包含的文件包括一个网页控制库项目和一个示范网站。 要开始,打开包含的压缩文件并将两个项目安装到你的文件系统中。 打开IIS并为web应用程序创建一个虚拟目录。 将解决方案打开 Visual Studio 2005并进行任何必要的更改以将两个项目都放入解决方案中。 配置好后,解决方案资源管理器应该显示这些项目,引用和文件:

图 2: 带有网络应用程序和控制库的解决方案资源管理器

在检查解决方案时,注意"stocktracker"控件库只包含一个控件,该控件称为" StockDog"。 这个项目还包括一个指向的web引用,这个站点支持用于获取股票价格的web服务。

web应用程序只包含一个网页( Default.aspx ),并包含对"stocktracker"dll的引用。

web应用程序用作用于测试自定义控件的容器;Default.aspx 页包含自定义控件的三个单独实例。 这三个实例分别用于从三个单独的股票中检索股票信息。

代码:StockDog

在初始化过程中使用自定义控件从web服务检索信息,并使用该信息填充本地成员变量;每个本地成员变量都设置为包含从web服务中收集的值之一。

web服务以XML字符串的形式返回请求的数据;解析这里字符串以获取用于填充成员变量的单个值。 这些成员变量又用于在呈现页面时显示股票信息。

在检查代码时,注意,除了缺省导入之外,只添加了 System.XML 类。 类本身从 WebControl 类继承。

Imports SystemImports System.Collections.GenericImports System.ComponentModelImports System.TextImports System.WebImports System.Web.UIImports System.Web.UI.WebControlsImports System.Xml
<DefaultProperty("StockTicker"), _
 ToolboxData("<{0}:StockDog" & _ 
 "runat="server"></{0}:StockDog>")> _PublicClass StockDog
 Inherits WebControl

在类声明之后,创建一个名为"声明"的区域,在该区域中,该区域是控件中使用的所有 private 成员变量的声明。

#Region"Declarations" 
 Private mStocks As net.webservicex.www.StockQuote
 Private mXmlDoc As XmlDocument
 Private mStockTicker AsStringPrivate mLast AsStringPrivate mDate AsStringPrivate mTime AsStringPrivate mChange AsStringPrivate mOpen AsStringPrivate mHigh AsStringPrivate mLow AsStringPrivate mVolume AsStringPrivate mMktCap AsStringPrivate mPrevClose AsStringPrivate mPercentChng AsStringPrivate mAnnRange AsStringPrivate mEarns AsStringPrivate mPE AsStringPrivate mName AsString#End Region

声明了变量之后,定义了另一个区域,在该区域中,用于捕获来自web服务的数据,并读取该服务返回的XML字符串,并使用这些值填充成员变量。 每次初始化控件时,init 处理程序调用一个称为" Fetch"的子例程。 Fetch 以字符串的形式接受单个参数,该字符串带有股票符号(。比如,微软的微软)。

Fetch 中,创建了一个新的XML文档。 mStocks 字符串变量用于捕获从服务web方法的web GetQuote 返回的XML字符串。 GetQuote 接受股票符号作为参数。 返回的字符串作为XML加载到XML文档中。

返回并放置 inside 文档后,下一个代码位定位每个特定节点并捕获与该节点相关的值。

方法区域中包含的代码如下所示:

#Region"Methods" 
 PrivateSub StockDog_Init(ByVal sender AsObject, _
 ByVal e As System.EventArgs) HandlesMe.Init
 Fetch(StockTicker)
 EndSubPublicSub Fetch(ByVal strStock AsString)
 mXmlDoc = New XmlDocument()
 mStocks = New net.webservicex.www.StockQuote
 Dim strQuote AsString = mStocks.GetQuote(strStock)
 mXmlDoc.LoadXml(strQuote)
 ' Set all of the private member variables to' contain the values from the xml string returned' from the web service' Last Dim lastNodes As XmlNodeList
 Dim lastNode As XmlNode
 lastNodes = mXmlDoc.GetElementsByTagName("Last")
 ForEach lastNode In lastNodes
 mLast = lastNode.ChildNodes(0).Value
 Next' DateDim dateNodes As XmlNodeList
 Dim dateNode As XmlNode
 dateNodes = mXmlDoc.GetElementsByTagName("Date")
 ForEach dateNode In dateNodes
 mDate = dateNode.ChildNodes(0).Value
 Next' TimeDim timeNodes As XmlNodeList
 Dim timeNode As XmlNode
 timeNodes = mXmlDoc.GetElementsByTagName("Time")
 ForEach timeNode In timeNodes
 mTime = timeNode.ChildNodes(0).Value
 Next' ChangeDim changeNodes As XmlNodeList
 Dim changeNode As XmlNode
 changeNodes = mXmlDoc.GetElementsByTagName("Change")
 ForEach changeNode In changeNodes
 mChange = changeNode.ChildNodes(0).Value
 Next' OpenDim openNodes As XmlNodeList
 Dim openNode As XmlNode
 openNodes = mXmlDoc.GetElementsByTagName("Open")
 ForEach openNode In openNodes
 mOpen = openNode.ChildNodes(0).Value
 Next' HighDim highNodes As XmlNodeList
 Dim highNode As XmlNode
 highNodes = mXmlDoc.GetElementsByTagName("High")
 ForEach highNode In highNodes
 mHigh = highNode.ChildNodes(0).Value
 Next' LowDim lowNodes As XmlNodeList
 Dim lowNode As XmlNode
 lowNodes = mXmlDoc.GetElementsByTagName("Low")
 ForEach lowNode In lowNodes
 mLow = lowNode.ChildNodes(0).Value
 Next' VolumeDim volumeNodes As XmlNodeList
 Dim volumeNode As XmlNode
 volumeNodes = mXmlDoc.GetElementsByTagName("Volume")
 ForEach volumeNode In volumeNodes
 mVolume = volumeNode.ChildNodes(0).Value
 Next' MrkCapDim MrkCapNodes As XmlNodeList
 Dim MrkCapNode As XmlNode
 MrkCapNodes = mXmlDoc.GetElementsByTagName("MktCap")
 ForEach MrkCapNode In MrkCapNodes
 mMktCap = MrkCapNode.ChildNodes(0).Value
 Next' PrevCloseDim prevCloseNodes As XmlNodeList
 Dim prevCloseNode As XmlNode
 prevCloseNodes = _
 mXmlDoc.GetElementsByTagName("PreviousClose")
 ForEach prevCloseNode In prevCloseNodes
 mPrevClose = prevCloseNode.ChildNodes(0).Value
 Next' mPercentChngDim percentChngNodes As XmlNodeList
 Dim percentChngNode As XmlNode
 percentChngNodes = _
 mXmlDoc.GetElementsByTagName("PercentageChange")
 ForEach percentChngNode In percentChngNodes
 mPercentChng = percentChngNode.ChildNodes(0).Value
 Next' mAnnRangeDim annRangeNodes As XmlNodeList
 Dim annRangeNode As XmlNode
 annRangeNodes = mXmlDoc.GetElementsByTagName("AnnRange")
 ForEach annRangeNode In annRangeNodes
 mAnnRange = annRangeNode.ChildNodes(0).Value
 Next' mEarnsDim earnsNodes As XmlNodeList
 Dim earnsNode As XmlNode
 earnsNodes = mXmlDoc.GetElementsByTagName("Earns")
 ForEach earnsNode In earnsNodes
 mEarns = earnsNode.ChildNodes(0).Value
 Next' mPEDim PENodes As XmlNodeList
 Dim PENode As XmlNode
 PENodes = mXmlDoc.GetElementsByTagName("P-E")
 ForEach PENode In PENodes
 mPE = PENode.ChildNodes(0).Value
 Next' mNameDim nameNodes As XmlNodeList
 Dim nameNode As XmlNode
 nameNodes = mXmlDoc.GetElementsByTagName("Name")
 ForEach nameNode In nameNodes
 mName = nameNode.ChildNodes(0).Value
 NextEndSub#End Region

代码中定义的下一个区域称为"属性";你可能猜到了,这个部分包含了控件使用的属性。 在这种情况下,除了通过 WebControl 类继承而传递的,唯一的属性是一个字符串值。 属性区域及其单个属性的定义如下:

#Region"Properties" 
 <Category("Stock Symbol")> _
 <Browsable(True)> _
 <Description("Enter the stock ticker value.")> _
 PublicProperty StockTicker() AsStringGetReturn mStockTicker
 EndGetSet(ByVal value AsString)
 mStockTicker = value
 EndSetEndProperty#End Region

类别。可以浏览和描述的属性用于为自定义控件提供设计时支持。 当开发人员使用控件选择这里控件时,将在ide编辑器的属性中显示类别和说明文本。

从web服务返回的XML字符串中捕获值,并使用XML中包含的值填充本地成员变量。 名为"呈现"的区域,它跟随并包含在页面上呈现控件所需的代码。

用来呈现控件的代码相当简单;HtmlTextWriter 用于定义表并设置它的特征,表的每一行包含两个单元格,每个单元格中都放置一个标签和相应值。 一旦所有数据都写入到 table 中,就会呈现结束标记,并且控件完成。

自然,你可以更改 table的配置,或者通过在 HtmlTextWriter 中定义的HTML定义来删除从web服务返回的数据。 通过使用 HtmlTextWriter,重写 RenderContents 子例程并在这个子例程中格式化 HTML。

#Region"Rendering" 
 ProtectedOverridesSub RenderContents(ByVal output As HtmlTextWriter)
 output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "3")
 output.AddAttribute(HtmlTextWriterAttribute.Border, "1")
 output.RenderBeginTag(HtmlTextWriterTag.Table)
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Stock: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(StockTicker)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Company: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mName)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Last: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mLast)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Date: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mDate)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Time: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mTime)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Change: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mChange)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Open: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mOpen)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>High: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mHigh)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Low: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mLow)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Volume: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mVolume)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Market Cap: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mMktCap)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Previous Close: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mPrevClose)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Percent Change: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mPercentChng)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Annual Range: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mAnnRange)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Earnings: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mEarns)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>P-E: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(mPE)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderEndTag()
 EndSub#End Region

代码:站点页面的演示默认

演示站点中包含的Default.aspx 页面只为控件提供一个测试容器。 页面包含一个带有居中的table的面板。 table 包含三列和一行。 将单个自定义控件添加到三个列的每个列中。 控件中的每个自定义控件都通过属性编辑器设置了它的StockTicker 属性。 在 table 下面是一个按钮,该按钮只能使用标签"更新",按钮只能强制将每个自定义控件的更新。

图 3: 在设计时设置 StockTicker 属性

摘要

这里项目旨在描述一个有用的。易于构建的自定义控件。 虽然这里演示仅限于描述 StockTracker 自定义控件,但这里应用的方法将适用于各种其他自定义控件。



文章标签:控制  TRAC  custom-control  Stock  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语