七月 22

使用 ZedGraph 製作統計圖

程式 沒有回應 »   瀏覽人數:[ 885user+549bot ]

這幾天研究了 ZedGraph,發現它是一套很好用的畫圖表工具,練習做了一個統計圖,大家參考看看!

C#:
  1. //記得要加入參考
  2. using ZedGraph;
  3.  
  4. //資料來源       
  5. private DataTable getDT()
  6. {
  7.     DataTable dt = new DataTable();
  8.     dt.Columns.Add("學號", System.Type.GetType("System.String"));
  9.     dt.Columns.Add("姓名", System.Type.GetType("System.String"));
  10.     dt.Columns.Add("國文", System.Type.GetType("System.Int32"));
  11.     dt.Columns.Add("英文", System.Type.GetType("System.Int32"));
  12.     dt.Columns.Add("數學", System.Type.GetType("System.Int32"));
  13.  
  14.     dt.Rows.Add("B9510001", "崔昱翰", 85, 66, 71);
  15.     dt.Rows.Add("B9510002", "王詩光", 65, 92, 88);
  16.     dt.Rows.Add("B9510003", "劉育白", 52, 66, 63);
  17.     dt.Rows.Add("B9510004", "許威宇", 98, 70, 61);
  18.     dt.Rows.Add("B9510005", "李佩珊", 81, 63, 76);
  19.     dt.Rows.Add("B9510006", "潘紹興", 91, 77, 76);
  20.  
  21.     return dt;
  22. }
  23.  
  24. //學生成績
  25. public void StudentChart1(ZedGraphControl zgc)
  26. {
  27.     // Google網域搜尋:Fill site:http://zedgraph.sourceforge.net/documentation
  28.  
  29.     GraphPane myPane = zgc.GraphPane;
  30.    
  31.     //
  32.     DataTable dt = getDT();
  33.  
  34.     // Set the title and axis labels
  35.     myPane.Title.Text = "學生成績量化表";
  36.     myPane.XAxis.Title.Text = "學生姓名";
  37.     myPane.YAxis.Title.Text = "分數";
  38.  
  39.     PointPairList list1 = new PointPairList();
  40.     PointPairList list2 = new PointPairList();
  41.     PointPairList list3 = new PointPairList();
  42.    
  43.     Random rand = new Random();
  44.  
  45.     // Generate random data for three curves
  46.     for (int i = 0; i <dt.Rows.Count; i++)
  47.     {
  48.        
  49.         double x = (double)i;
  50.         double y1_chian = Convert.ToDouble(dt.Rows[i]["國文"]);
  51.         double y2_eng = Convert.ToDouble(dt.Rows[i]["英文"]);
  52.         double y3_math = Convert.ToDouble(dt.Rows[i]["數學"]);
  53.         list1.Add(x, y1_chian);
  54.         list2.Add(x, y2_eng);
  55.         list3.Add(x, y3_math);
  56.     }
  57.  
  58.     // create the curves
  59.     // BarItem.Bar.Fill(Color) 填入單一顏色
  60.     // BarItem.Bar.Fill(Color, Color, Color, 90) 填入漸層顏色,第4參數是旋轉角度
  61.     BarItem myCurve1 = myPane.AddBar("國文", list1, Color.Red);
  62.     myCurve1.Bar.Fill = new Fill(Color.FromArgb(255, 238, 221));
  63.    
  64.     BarItem myCurve2 = myPane.AddBar("英文", list2, Color.Blue);
  65.     myCurve2.Bar.Fill = new Fill(Color.FromArgb(221, 255, 238));
  66.    
  67.     BarItem myCurve3 = myPane.AddBar("數學", list3, Color.Green);
  68.     myCurve3.Bar.Fill = new Fill(Color.FromArgb(238, 221, 255));
  69.  
  70.    
  71.    
  72.     // Fill the axis background with a color gradient
  73.     // 背景色
  74.     // myPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 166), 45.0F);
  75.  
  76.     myPane.XAxis.MajorTic.IsBetweenLabels = true;
  77.  
  78.     //加入X LabelText
  79.     string[] labels = new string[6];
  80.     for (int i = 0; i <dt.Rows.Count; i++)
  81.     {
  82.         labels[i] = Convert.ToString(dt.Rows[i]["姓名"]);
  83.     }
  84.     myPane.XAxis.Scale.TextLabels = labels; //X軸的說明文字
  85.     myPane.XAxis.Type = AxisType.Text;      //X軸類型
  86.  
  87.     //重新計算目前數據範圍
  88.     zgc.AxisChange();
  89.  
  90.     // expand the range of the Y axis slightly to accommodate the labels
  91.     // myPane.YAxis.Scale.Max += myPane.YAxis.Scale.MajorStep;
  92.     // YAxis最大值
  93.     myPane.YAxis.Scale.Max = 110;
  94.  
  95.     // Create TextObj's to provide labels for each bar
  96.     // 在bar上顯示數值
  97.     BarItem.CreateBarLabels(myPane, false, "f0");
  98.  
  99.     //顯示格點
  100.     myPane.YAxis.MajorGrid.IsVisible = true;
  101.     myPane.XAxis.MajorGrid.IsVisible = true;
  102. }

七月 21

        最近參考了幾個統計圖表控件包,OpenSource 的有 ZedGraphNplot 等,但是相比之下還是 ZedGraph 強大,方便一些,其他的感覺還是半成品。

        收費的套件就多了,只要是商業的報表開發工具都有統計圖表的功能,水晶報表,ActiveReport,Reporting Service,不過要方便,功能單一的還是 dotnetCharting。下面主要從 winform 使用上說說 ZedGraph 和 dotnetCharting。

        從效果上說 dotnetCharting 確實沒的說,水晶式效果很是炫目,這應該是其最大的賣點。為了便於開發者學習,帶了各種效果的示例代碼。DotnetCharting 在產生統計圖的時候需要設置一個臨時目錄,用來保存產生的統計圖的圖片,dotnetCharting 的圖表效果好,很大程度上是因為它生成了圖片,然後將其顯示在界面上。當然,作為代價,它犧牲了性能。同時,它不支持縮放,雖然你可以通過更改坐標軸的刻度來實現這個功能,但是性能上就差了很多。

如果你對性能要求不高,dotnetCharting 是非常好的選擇。

        ZedGraph 最大的賣點在哪裡?應該是OpenSource,你可以修改代碼以適應自己的需求,例如:ZedGraph 在畫線型圖的時候,線條沒有使用抗鋸齒,你只要修改 Line類的 Default 結構中的預設設置就可以了。和 dotnetCharting 相比,ZedGraph 的效果要差一些,不過,要是自己調整的好,也還不錯,但是 ZedGraph 的優勢不在這裡。

        由於 ZedGraph 是使用 GDI+ 直接在 Canvas 上進行描畫,所以,性能得到了保證,如果你改變坐標軸的刻度,和 dotnetCharing 相比,ZedGraph 的反應速度是很快的。基於此,ZedGraph 提供了很重要的縮放和拖動功能,你可以通過鼠標滾輪進行方法,縮小圖表,可以通過鼠標中鍵來拖動,非常方便。

        對於類似股市的實時走勢,CPU 使用率等實時變化的數據,使用 ZedGraph 也可以很方便地作到。ZedGraph 在基於 PointPairList 作畫,所以你只要在 PointPairList 這個集合中添加新的數據,然後進行重畫就可以實現了,對於性能,上面說了,由於是直接使用 GDI+,性能是比較好的,我測過 400 個點是沒問題的。所以,ZedGraph 對於實時要求比較強的需求也是可以應對的。

        總結的來說,dotnetCHARTING 產出的圖表效果好,但是性能方面較差,對實時要求強的需求不適應。ZedGraph 開放原始碼,效果比起 dotnetCHARTING 差,但是性能好,能適應有實時要求的數據。

本文章轉貼於:http://blog.csai.cn/user1/17072/archives/2009/37706.html

六月 22

其實 WinForm 跟 WebForm 在連結資料庫方面其實差不了太多。

C#:
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.     //第一:連結SQL資料庫
  4.     string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test_Data.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";
  5.     SqlConnection conn = new SqlConnection(connstr);
  6.     conn.Open();
  7.  
  8.     //第二:執行SQL指令
  9.     string sqlstr = "select * from test";
  10.     SqlCommand cmd = new SqlCommand(sqlstr,conn);
  11.  
  12.     SqlDataReader dr = cmd.ExecuteReader();
  13.  
  14.     //第三:印出資料
  15.     while (dr.Read())
  16.     {
  17.         Response.Write("文章編號:" + dr["id"] + "<br>");
  18.         Response.Write("日  期:" + dr["test_time"] + "<br>");
  19.         Response.Write("文章標題:" + dr["title"]);
  20.         Response.Write("<hr>");
  21.     }
  22.  
  23.     //第四:關閉連線
  24.     cmd.Cancel();
  25.     dr.Close();
  26.     conn.Close();
  27.     conn.Dispose();
  28. }

六月 22

工具:RequiredFieldValidator
驗證:必要輸入項
說明:確保使用者不會略過輸入項目。如需詳細資訊,請參閱 HOW TO:驗證 ASP.NET 伺服器控制項的必要項目。

工具:CompareValidator
驗證:與某個值的比較
說明:使用比較運算子 (例如小於、等於、大於),將使用者輸入的值與常數值、另一個控制項的值,或特定資料型別做比較。如需詳細資訊,請參閱 HOW TO:比對特定值驗證 ASP.NET 伺服器控制項和 HOW TO:比對資料型別驗證 ASP.NET 伺服器控制項。

工具:RangeValidator
驗證:範圍檢查
說明:檢查使用者的輸入是否介於指定的上下限之間。您可以檢查成對的數字、英文字母字元和日期內的範圍。如需詳細資訊,請參閱 HOW TO:比對範圍值驗證 ASP.NET 伺服器控制項。

工具:RegularExpressionValidator
驗證:樣式比對
說明:檢查輸入是否符合規則運算式 (Regular Expression) 所定義的樣式。這類的驗證可讓您檢查字元 (例如電子郵件地址、電話號碼、郵遞區號等項目中的字元) 的預期順序。如需詳細資訊,請參閱 HOW TO:比對模式驗證 ASP.NET 伺服器控制項。

工具:CustomValidator
驗證:使用者定義
說明:使用您自己撰寫的邏輯驗證使用者的輸入。這類驗證可讓您檢查執行階段時衍生的值。如需詳細資訊,請參閱 HOW TO:使用 ASP.NET 伺服器控制項的自訂函式驗證HOW TO:比對資料庫值驗證 ASP.NET 伺服器控制項。


MSDN

六月 21

  在 VS20085 工具列中,AJAX 擴充功能這個選項是內建的,不過在 VS2005 中並沒有,現在坊間的書籍大多以 VS2008 為主,會常用到 AJAX 功能,不過如果不更換版本,在 VS2005 中也可以安裝 AJAX 擴充功能。你必須下載以下檔案(約1MB多)安裝完成後,AJAX 擴充功能就會出現了。

下載檔案:
ASP.NET AJAX 1.0

六月 20

[寫程式] 藝術?還是快速開發?

程式 沒有回應 »   瀏覽人數:[ 835user+385bot ]

  用 Visual Studio 久了會發現一個問題,就是會越來越依賴這個開發工具,因為它什麼都幫你處理好了,程式指令永遠只記得前面三個字母,因為VS有指令自動補齊,連接資料庫有精靈幫忙,管你是 MSSQL 還是 Access,全部按一按搞定,還順便幫你把 Insert、Update、Select、Delete…等 SQL 四大溝通指令寫好了,程式就這麼在拖拉、設定之間開發完成,有的甚至不用寫任何一行指令。

  以前我很排斥用精靈方式來寫程式,堅持一字一句 Key 出來,不過我發現這會花費很多時間,舉個例子來說好了,寫一個簡單的通訊錄,不包括建資料庫的時間,用傳統手 Key 方式,我大概要花上半天的時間,因為我要拉控制項、設定控制項名稱、寫資料庫連接、資料繫結、資料配接器的 Insert、Update、Select、Delete 四個屬性質、設定 BindSource 導覽列…等,寫完天都黑了。

  不過如果換成精靈模式寫,大概只要30分鐘就可以搞定,在產出力方面,精靈模式大勝,不過在程式靈活度、和可讀性來說,還是傳統手 Key 方式略勝一籌。

  站在公司的立場,當然希望程式設計師的產出力越多越好,有些小地方還是用拖拉的就好,藝術這種東西不能當飯吃,VS是一個很邪惡的東西,因為他讓新手認為寫程式是一件很簡單的東西,讓老手離不開它。

六月 19

C# string.Format輸出格式

程式 沒有回應 »   瀏覽人數:[ 2,389user+836bot ]
C#:
  1. 前面補0的數字字串
  2. String.Format("{0:0000}", 157); // 輸出 0157
  3.  
  4. 前後都補0的數字字串
  5. String.Format("{0:0000.0000}", 157.42); // 輸出 0157.4200
  6.  
  7. 3位數()加逗號
  8. (String.Format("{0:0,0}", 38560); // 輸出 38,560
  9.  
  10. 格式化電話號碼
  11. (String.Format("{0:(###) ###-####}", 8005551212); // 輸出 (800) 555-1212
  12.  
  13. 金額的表示
  14. (String.Format("{0:$#,##0.00;($#,##0.00);Zero}", 0); // 這個會顯示 Zero
  15. (String.Format("{0:$#,##0.00;($#,##0.00);Zero}", 1243.50); // 這個會顯示 $1,243.50

依照上面格式範例 ~ 套用到我的報表要呈現的欄位 ~ 如以下 ~

C#:
  1. private void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
  2.   {
  3.    if (e.Item.ItemIndex.ToString() != "-1")
  4.    {
  5.     e.Item.Cells[0].Text = string.Format("{0:#,0.0}",double.Parse(e.Item.Cells[3].Text.ToString()));
  6.    }
  7.   }

參考資料來源:
http://blog.stevex.net/index.php/string-formatting-in-csharp/

六月 18

伺服器應用程式無法使用
您嘗試在此 Web 伺服器上存取的 Web 應用程式目前無法使用。
請按 Web 瀏覽器中的 [重新整理] 按鈕,再試一次。

系統管理員注意:
Web 伺服器的應用程式事件記錄檔中的
錯誤訊息詳細說明了這項特定要求失敗原因。
請檢閱這個記錄項目,查看造成錯誤的原因為何。

終於找到
方法解決了~"~

http://blog.xuite.net/giin/blog/13640747

請直接到
[開始]→[執行]→輸入
[ C:\WINDOWS\Microsoft.Net\Framework\v2.0.50727\aspnet_regiis.exe -i ] 就行了

最後確認一下預設的IIS執行環境

IIS→預設網站→內容→ASP.NET→確認 版本2.0.50727

應該就OK了!!

二月 04
C#:
  1. DateTime dt1 = new DateTime(2008, 12, 31);
  2. DateTime dt2 = new DateTime(2009, 2, 13);
  3. TimeSpan s = new TimeSpan(dt2.Ticks - dt1.Ticks);
  4. MessageBox.Show(Convert.ToString(s.Days));
  5.  
  6. //回傳44天,相反則為負值

 

參考網址:
C# 如何取得兩個 DateTime 日期之間的天數
TimeSpan MSDN

 

二月 02

列舉 (enum) 資料型別

程式 沒有回應 »   瀏覽人數:[ 1,108user+634bot ]

  enum 是一種用來宣告列舉型別 (Enumeration Type) 的關鍵字,是一組列舉清單項目的具名常數所構成的特殊型別,emun 主要目的在提高程式的可讀性,及易維護性,使用 enum 有以下幾點需要注意:

  1. enum 不能使用於方法 (Method) 內宣告。
  2. 資料型別必須是 byte,sbyte,short,ushort,int,uint,long 或 ulong。
  3. 預設資料型別為 int。
  4. float 與 double 不可為 enum 的資料型別。

關於列舉的宣告方式如下:

[存取修飾詞] enum [列舉名稱] : [資料型別]
{
  [成員1],
  [成員2],
  ...
  [成員n]
}

 

關列舉範例程式如下:

C#:
  1. public enum student : short
  2.         {
  3.             周杰倫 = 1,
  4.             方文山 = 2,
  5.             蔡依林 = 3,
  6.             王立宏 = 4
  7.         }
  8.  
  9.         private void button1_Click(object sender, EventArgs e)
  10.         {
  11.             //將combox的文字數字轉換成短整數
  12.             short num = 0;
  13.             if (cbox.Text != "")
  14.             {
  15.                 num = short.Parse(cbox.Text);
  16.             }
  17.  
  18.             switch (num)
  19.             {
  20.                 case (short) student.周杰倫:
  21.                     MessageBox.Show("周杰倫", "明星");
  22.                     break;
  23.                 case (short) student.蔡依林:
  24.                     MessageBox.Show("蔡依林", "明星");
  25.                     break;
  26.                 case (short) student.方文山:
  27.                     MessageBox.Show("方文山", "明星");
  28.                     break;
  29.                 case (short) student.王立宏:
  30.                     MessageBox.Show("王立宏", "明星");
  31.                     break;
  32.                 default:
  33.                     MessageBox.Show("所選取數值不在範圍中","注意");
  34.                     break;
  35.             }

 1 2 3 4 5 下一頁