使用 ASP.Net 和 AJAX 控件进行在线股票流
本文介绍了如何使用 ASP.Net 和 AJAX 控件进行在线股票流
引言
我一直很好奇像 http://finance.yahoo.com 和 http://finance.google.com 这样的网站如何快速地在线显示股票报价,并且不刷新整个页面。所以,我决定实现类似的功能。实现这种流媒体似乎非常困难,但 ASP.Net 及其功能丰富的 AJAX 控件使得实现它变得非常简单。这是我第一次尝试构建类似的流媒体网页。这个示例对你来说可能听起来很简单,有些人可能会认为每个人都知道这一点。但对于那些想构建类似的网站,但仍然不知道从哪里开始的人来说,这可能提供了一个很好的基础。
使用代码
本文提供的示例代码包括一个网页 Default.aspx 和 Default.aspx.cs 后台代码。
Default.aspx (UI)
<!--Script Manager must be inserted before any other AJAX control--> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <!--Ajax update panel--> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <!--Grid View which will display quotes--> <asp:GridView ID="GridView1" runat="server" Width="800px" BackColor="White" BorderColor="#336666" BorderStyle="Double" BorderWidth="3px" CellPadding="4" GridLines="Horizontal"> <FooterStyle BackColor="White" ForeColor="#333333" /> <RowStyle BackColor="White" ForeColor="#333333" /> <SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" /> <PagerStyle ForeColor="White" HorizontalAlign="Center" BackColor="#336666" /> <HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" /> </asp:GridView> <!--Ajax Timer control which will refresh grid view at specified interval (2 seconds)--> <asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="Timer1_Tick" Enabled=true > </asp:Timer> </ContentTemplate> </asp:UpdatePanel>
UI 代码非常简单。第一个组件是脚本管理器 (Script Manager)。此组件是 AJAX 功能所必需的。在脚本管理器之后,下一个组件是 UpdatePanel。此 ajax 控件阻止 ASP.Net 页面回发。它不回发页面,而是使用客户端 javascript 将控件输入发送到服务器。当它收到来自服务器的响应时,它会在客户端刷新其内部内容。下一个控件是 AJAX 计时器控件。它每 2 秒用新的报价重新绑定网格。
Default.aspx.cs (后台代码)
DataTable GetGridData() { DataTable DT = new DataTable(); DT.Columns.Add("Symbol",typeof(string)); DT.Columns.Add("Company Name",typeof(string)); DT.Columns.Add("LastTrade", typeof(float)); DT.Columns.Add("Bid", typeof(float)); DT.Columns.Add("Ask", typeof(float)); DT.Columns.Add("Volume", typeof(int)); DT.Columns.Add("Market Capital", typeof(string)); DT.Columns.Add("EPS", typeof(float)); DT.Columns.Add("P/E", typeof(float)); Random r = new Random(); //Apple //Get a random value of last trade, bid, ask and volume. float LastTrade = ((float)r.Next(17222,17434))/100; float Bid = LastTrade - (float)0.34; float Ask = LastTrade + (float)0.43; int Volume = r.Next(23000000, 23600000); DT.Rows.Add("AAPL", "Apple Inc.", LastTrade, Bid, Ask, Volume, "153.88B", 3.93, 44.71); //Microsoft LastTrade = ((float)r.Next(3378, 3487)) / 100; Bid = LastTrade - (float)0.34; Ask = LastTrade + (float)0.43; Volume = r.Next(38064903, 40075689); DT.Rows.Add("MSFT", "Microsoft Corporation", LastTrade, Bid, Ask, Volume, "153.88B", 2.13, 21.2); //Yahoo LastTrade = ((float)r.Next(2520, 2834)) / 100; Bid = LastTrade - (float)0.34; Ask = LastTrade + (float)0.43; Volume = r.Next(14400000, 15500000); DT.Rows.Add("YHOO", "Yahoo Inc.", LastTrade, Bid, Ask, Volume, "34.48B", 1.42, 10.23); //Google LastTrade = ((float)r.Next(67025, 69000)) / 100; Bid = LastTrade - (float)5; Ask = LastTrade + (float)5; Volume = r.Next(4500000, 5000000); DT.Rows.Add("GOOG", "Google Inc.", LastTrade, Bid, Ask, Volume, "213.73B", 12.42, 53.23); //WYNN LastTrade = ((float)r.Next(13249, 14022)) / 100; Bid = LastTrade - (float)0.90; Ask = LastTrade + (float)0.89; Volume = r.Next(1222785, 1400000); DT.Rows.Add("WYNN", "Wynn Resorts Ltd.", LastTrade, Bid, Ask, Volume, "15.13B",1.81, 73.15); return DT; }
GetGridData() 函数模拟不同股票代码的报价。除了模拟数据,您还可以替换此函数以从其他来源获取实时报价。此函数使用随机报价构建一个数据表并返回它。
protected void Timer1_Tick(object sender, EventArgs e) { //Bind grid view GridView1.DataSource = GetGridData(); GridView1.DataBind(); }
Timer1_Tick() 函数是一个计时器函数,每 2 秒执行一次。它使用模拟股票数据重新绑定网格。
关注点
正如您在这里看到的,我正在使用模拟股票报价。了解我们如何从 Yahoo/Google 或任何其他来源获取实时报价会很有趣。
以下是我找到的几个讨论这个问题的链接,
http://tutorials.programmingsite.co.uk/yahoocsv.php http://asp.programmershelp.co.uk/xmlstock1.php
http://www.webdeveloper.com/forum/archive/index.php/t-6821.html
http://aspalliance.com/articleViewer.aspx?aId=112&pId=
如果您有任何其他想法,请在这里发布。