首先是輸出img標簽,然後輸出一個map 標簽。
由於餅圖項目可以帶有超鏈接,這裡就能生成map/area元素來在圖片中定義熱 點,在HTML語法中,圖片熱點沒有扇形區域種類,因此只好使用使用多邊形來模擬扇形。也 就是使用Html標記”<area shape=poly coords=’多邊形的頂點坐標’ />”來模擬扇形熱點。
我們遍歷所與的餅圖項目,調用GetPoints函數獲得 模擬這個項目對應的扇形區域的點坐標,將這些點坐標數據填寫到area元素的coord屬性中, 然後還填上title屬性來顯示提示文本,設置href屬性來設置這個圖片熱點的超鏈接地址。
HTML文檔輸出完畢後我們獲得這個XML字符串,去掉前面的XML聲明頭,然後就把這個 XML字符串當作Html字符串返回給主程序了。
GetPoints函數就是獲得模擬扇形區域的 點坐標,首先是根據餅圖項目創建一個路徑,調用路徑的Flatten函數進行線段模擬運算,然 後獲得它的PathPoints屬性,這個屬性值是PointF類型的數組,需要轉換為Point數組。
主頁面 pIE.ASPx
這個頁面是演示程序的主頁面,界面上放置一個名為 lblResult的標簽,察看它的C#代碼也不復雜,主要是Page_Load方法,其代碼為
private void Page_Load(object sender, System.EventArgs e)
{
// 連接數據庫
using( OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("demomdb.mdb");
conn.Open();
// 查詢數據庫
using( OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = @"
select top 10
customers.customerid ,
customers.companyname as 客戶名稱,
( select sum( round( orderdetails.unitprice
* orderdetails.quantity
* ( 1.0 - orderdetails.discount) , 2 ) )
from orderdetails , orders
where orderdetails.orderid = orders.orderid
and orders.customerid = customers.customerid
) as 訂單總金額
from customers";
OleDbDataReader reader = cmd.ExecuteReader();
// 創建餅圖對象
PieShape pie = new PIEShape();
pIE.Width = 400 ;
pIE.Height = 300 ;
System.IO.StringWriter writer = new System.IO.StringWriter();
while( reader.Read())
{
string id = Convert.ToString( reader.GetValue( 0 ));
double Value = Convert.ToDouble( reader.GetValue( 2 ));
string Text = "客戶名稱:" + Convert.ToString( reader.GetValue( 1 ))
+ "\r\n訂單金額:" + Convert.ToString( reader.GetValue( 2 ))
+ "\r\n點擊察看該客戶訂單的詳細情況" ;
string Link = "pIE_orders.ASPx?customerid=" + id ;
pIE.Add( Value , Text , Link );
}//while
reader.Close();
pIE.RefreshState();
this.Session["pie_customers"] = pIE ;
this.lblResult.Text = pIE.GetHtmlString("pIEimage.ASPx?name=pIE_customers");
this.DataGrid1.DataSource = pIE ;
this.DataGrid1.DataBind();
}
}
}