#眉標=VS2008、WCF、SOA #副標=體驗新一代整合開發環境(8) #大標=WCF搭配Virtual Earth的銷售分析程式 #作者=文/圖 王寧疆 ===<反灰>============= [ServiceContract] public interface IService { [OperationContract] SalesTerritory[] GetSalesTerritory(); //查詢銷售資訊的功能 } [DataContract] public class SalesTerritory { private int m_TerritoryID; //存放TerritoryID屬性內容值的變數 private string m_TerritoryName; //存放TerritoryName屬性內容值的變數 private decimal m_SalesYTD; //存放SalesYTD屬性內容值的變數 private decimal m_SalesLastYear; //存放SalesLastYear屬性內容值的變數 private double m_Latitude; //存放Latitude屬性內容值的變數 private double m_Longitude; //存放Longitude屬性內容值的變數 private string m_Person; //存放Person屬性內容值的變數 [DataMember()] public int TerritoryID //定義TerritoryID屬性 { get {return m_TerritoryID;} set {m_TerritoryID = value;} } [DataMember()] public string TerritoryName //定義TerritoryName屬性 { get {return m_TerritoryName;} set {m_TerritoryName = value;} } [DataMember()] public decimal SalesYTD //定義SalesYTD屬性 { get {return m_SalesYTD;} set {m_SalesYTD = value;} } [DataMember()] public decimal SalesLastYear //定義SalesLastYear屬性 { get {return m_SalesLastYear;} set {m_SalesLastYear = value;} } [DataMember()] public double Latitude //定義Latitude屬性 { get {return m_Latitude;} set {m_Latitude = value;} } [DataMember()] public double Longitude //定義Longitude屬性 { get {return m_Longitude;} set {m_Longitude = value;} } [DataMember()] public string Person //定義Person屬性 { get {return m_Person;} set {m_Person = value;} } } ================ ===<反灰>============= using System.Data; using System.Web.Hosting; 然後將Service類別編輯成以下的樣子: public class Service : IService { public SalesTerritory[] GetSalesTerritory() //定義查詢銷售資訊的功能 { DataSet ds=new DataSet(); //建立DataSet類別的物件 ds.ReadXml(HostingEnvironment.ApplicationPhysicalPath + "/App_Data/SalesTerritory.xml"); //讀取存放在App_Data資料夾底//下SalesTerritory.xml檔案中的銷售資訊 SalesTerritory[] st=new SalesTerritory[ds.Tables[0].Rows.Count];//建立存放SalesTerritory物件的陣列 int i = 0; //宣告存放陣列註標的變數 foreach (DataRow dr in ds.Tables[0].Rows) //取出DataSet中第一個資料表中的所有記錄 { st[i] = new SalesTerritory(); //建立SalesTerritory類別的物件,當做st陣列的第i個元表 st[i].TerritoryID = int.Parse( dr["TerritoryID"].ToString()); //將記錄TerritoryID欄位的內容填到陣列的第i個元素中 st[i].TerritoryName = dr["TerritoryName"].ToString();//將記錄TerritoryName欄位的內容填到陣列的第i個元素中 st[i].SalesYTD = decimal.Parse( dr["SalesYTD"].ToString()); //將記錄SalesYTD欄位的內容填到陣列的第i個元素中 st[i].SalesLastYear = decimal.Parse( dr["SalesLastYear"].ToString());//將記錄SalesLastYear欄位的內容填到陣列的第i個元素中 st[i].Latitude = double.Parse( dr["Latitude"].ToString()); //將記錄Latitude欄位的內容填到陣列的第i個元素中 st[i].Longitude = double.Parse( dr["Longitude"].ToString()); //將記錄Longitude欄位的內容填到陣列的第i個元素中 st[i].Person = dr["Person"].ToString(); //將記錄Person欄位的內容填到陣列的第i個元素中 i ++; //遞增存放陣列註標的變數的內容值 } return st; } } ================ ===<反灰>============= 1 Central 4677108.269 3205014.0767 39.08150656 -105.6530308 Linda 以下省略 < /Territories> ================ ===<反灰>============= using System.Runtime.InteropServices; using UseSalesService.SalesService; ================ ===<反灰>============= private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(AppDomain.CurrentDomain.BaseDirectory + "HTML/MapControl.html");//令WebBrowser控制項瀏覽到負責顯示Virtual Earth地圖的HTML文件 webBrowser1.ObjectForScripting = this; //宣告Form1類別可以呼叫WebBrowser控制項顯示的HTML文件中的Javascript函數 ServiceClient sc =new ServiceClient(); //建立代理呼叫WCF服務的類別的物件 st = sc.GetSalesTerritory(); //呼叫GetSalesTerritory方法取得鎖售資訊 sc.Close(); //關閉代理呼叫WCF服務的物件 DataTable dt = new DataTable(); //建立DataTable類別的物件 dt.Columns.Add("TerritoryID", typeof(int)); //加入名稱為TerritoryID,型態為int的欄位 dt.Columns.Add("TerritoryName", typeof(string)); //加入名稱為TerritoryName,型態為string的欄位 dt.Columns.Add("SalesYTD", typeof(decimal)); //加入名稱為SalesYTD,型態為decimal的欄位 dt.Columns.Add("SalesLastYear", typeof(decimal)); //加入名稱為SalesLastYear,型態為decimal的欄位 dt.Columns.Add("Latitude", typeof(double)); //加入名稱為Latitude,型態為double的欄位 dt.Columns.Add("Longitude", typeof(double)); //加入名稱為Longitude,型態為double的欄位 dt.Columns.Add("Person", typeof(string)); //加入名稱為Person,型態為string的欄位 foreach (SalesTerritory t in st) //取出存放銷售記錄的陣列中的每一筆銷售資訊 { DataRow dr = dt.NewRow(); //建立DataRow類別的物件 dr["TerritoryID"] = t.TerritoryID; //填入TerritoryID欄位的內容 dr["TerritoryName"] = t.TerritoryName; //填入TerritoryName欄位的內容 dr["SalesYTD"] = t.SalesYTD; //填入SalesYTD欄位的內容 dr["SalesLastYear"] = t.SalesLastYear; //填入SalesLastYear欄位的內容 dr["Latitude"] = t.Latitude; //填入Latitude欄位的內容 dr["Longitude"] = t.Longitude; //填入Longitude欄位的內容 dr["Person"] = t.Person; //填入Person欄位的內容 dt.Rows.Add(dr); //將填好欄位內容的DataRow類別的物件加入到DataTable類別的物件中 } dataGridView1.DataSource = dt; //將DataTable類別的物件交給DataGridView控制項顯示 rbRoad.Checked = true; //設定rbRoad為被選中的RadioButton控制項 } ================ ===<反灰>============= private void AddInfoBoxChart(ChartChartTypeEnum ChartType) { object Missing = Type.Missing; //宣告沒有內容值的Missing變數 for (int i=0;iCountry Region:  US
Sales 2007:  {1}
" + "Sales 2008:  {2}"; //準備統計圖表下方的說明文字 string htmlTable = String.Format(strHTML, st[i].TerritoryName, st[i].SalesLastYear.ToString("C"), st[i].SalesYTD.ToString("C")); //填入數據到說明文字中 string PhysicalImageFileName = "file:///" + GraphImageFileName.Replace(@"\", "/"); //準備內容為統計圖表的圖檔的路徑 AddPushPinOnMap(st[i].Latitude.ToString(), st[i].Longitude.ToString(), PhysicalImageFileName, htmlTable, "SalesTerritory"); //為圖表的標記加上突現的圖形提示 } } ================ ===<反灰>============= private void AddPushPinOnMap(string latitude, string longitude, string imagePath, string htmlTable, string reportType) { webBrowser1.Document.InvokeScript("AddPushPinOnMap", new Object[] {latitude, longitude, imagePath, htmlTable, reportType}); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為AddPushPinOnMap的Javascript函數,於地圖上顯示標記 } ================ ===<反灰>============= public void ClearMap() { webBrowser1.Document.InvokeScript("ClearMap");//呼叫WebBrowser控制項顯示的HTML文件中名稱 //為ClearMap的Javascript函數 tbZoom.Minimum = 1; //設定TrackBar控制項的下限值 tbZoom.Maximum = 19; //設定TrackBar控制項的上限值 } ================ ===<反灰>============= private void rbRoad_CheckedChanged(object sender, EventArgs e) { webBrowser1.Document.InvokeScript("SetMapStyle", new Object[] {"r"}); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為SetMapStyle的Javascript函數,設定要以道路模式顯示地圖 } private void rbAerial_CheckedChanged(object sender, EventArgs e) { webBrowser1.Document.InvokeScript("SetMapStyle", new Object[] { "a" }); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為SetMapStyle的Javascript函數,設定要以空照模式顯示地圖 } private void rbMixed_CheckedChanged(object sender, EventArgs e) { webBrowser1.Document.InvokeScript("SetMapStyle", new Object[] { "h" }); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為SetMapStyle的Javascript函數,設定要以混合模式顯示地圖 } ================ ===<反灰>============= private void tbZoom_Scroll(object sender, EventArgs e) { webBrowser1.Document.InvokeScript("SetMapZoomLevel", new Object[] { tbZoom.Value }); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為SetMapZoomLevel的Javascript函數,傳入TrackBar控制項目前的位置,執行拉遠/拉近的效果 } ================ ===<反灰>============= private void ShowPopupInfoBox(int rowIndex) { webBrowser1.Document.InvokeScript("ShowPopupInfoBox", new Object[] {rowIndex}); //呼叫WebBrowser控制項顯示的HTML文件中名稱 //為ShowPopupInfoBox的Javascript函數,顯示標記的說明圖片 } private void HidePopupInfoBox() { webBrowser1.Document.InvokeScript("HidePopupInfoBox");//呼叫WebBrowser控制項顯示的HTML文件 //中名稱為HidePopupInfoBox的Javascript函數,隱藏標記的說明圖片 } ================ ===<反灰>============= private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { HidePopupInfoBox(); //將已顯示的標記說明圖片關閉 ShowPopupInfoBox(e.RowIndex + 1); //顯示指定的標記的說明圖片 } ================ ===<反灰>============= private void cbShowPin_CheckedChanged(object sender, EventArgs e) { ClearMap(); //將地圖設定成預設的初始狀態 if (cbShowPin.Checked) //再依據CheckBox控制項的勾選狀態決定是否要顯示出標記 { AddInfoBoxChart(ChartChartTypeEnum.chChartTypeColumnClustered); //在地圖上顯示標記 } } ================ ===<反灰>============= public void SalesAnalysis(int PinID) { EmployeeForm f = new EmployeeForm(); //建立EmployeeForm類別的物件 f.EmployeeID = PinID; //設定EmployeeForm類別的物件的EmployeeID屬性 f.ShowDialog(); //顯示EmployeeForm類別的物件 f.Dispose(); //丟棄EmployeeForm類別的物件 } ================ ===<反灰>============= SELECT LastName, FirstName, Title, TitleOfCourtesy, BirthDate, City, Country, HomePhone, Photo FROM dbo.Employees where EmployeeID=@EmployeeID ================ ===<反灰>============= private void EmployeeForm_Load(object sender, EventArgs e) { this.employeesTableAdapter.Fill(this.northwindDataSet.Employees, EmployeeID); //依據指定的EmployeeID查詢員工的基本資料 } ================ ===<反灰>============= internal int EmployeeID = 0; ================