七月 22

使用 ZedGraph 製作統計圖

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

這幾天研究了 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. }

六月 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. }

文章參考於:ASP.NET專題實務-適用C# 作者:周棟祥

六月 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

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

程式 1 個回應 »   瀏覽人數:[ 1,789user+648bot ]

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

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

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

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

六月 19

C# string.Format輸出格式

程式 沒有回應 »   瀏覽人數:[ 5,791user+1,552bot ]
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/

二月 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) 資料型別

程式 沒有回應 »   瀏覽人數:[ 2,112user+1,083bot ]

  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.             }

二月 01

結構 (struct) 資料型別

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

struct 是一種用來宣告結構的關鍵字,在結構中包含相關變數,可以將結構視為變數群組,以學生資料 (student) 來說,若要設計其結構,應該包含幾個相關變數,如:學號(num),姓名(name)、電話(tel)、手機(mobile)、地址(address)等,底下介紹結構的宣告及叫用方式:

結構 (struct) 宣告方式:

[存取修飾詞] struct [結構名稱]
{
  [存取修飾詞] [資料型別] [變數名稱];
  [存取修飾詞] [資料型別] [變數名稱];
  ...
}

 

結構 (struct) 叫用方式:

[結構名稱] [變數名稱];

 

語法範例:

C#:
  1. public struct Student
  2.         {
  3.             public string Num;
  4.             public string Name;
  5.             public string Tel;
  6.             public string Mobile;
  7.             public string Address;
  8.         }
  9.        
  10.         private void btnAdd_Click(object sender, EventArgs e)
  11.         {
  12.             //宣告結構
  13.             Student std;
  14.            
  15.             //指定成員變數
  16.             std.Num = txtNum.Text;
  17.             std.Name = txtName.Text;
  18.             std.Tel = txtTel.Text;
  19.             std.Mobile = txtMobile.Text;
  20.             std.Address = txtAddress.Text;
  21.  
  22.             String msg = "";
  23.             msg = msg + "學號:" + std.Num + "\n";
  24.             msg = msg + "姓名:" + std.Name + "\n";
  25.             msg = msg + "電話:" + std.Tel + "\n";
  26.             msg = msg + "手機:" + std.Mobile + "\n";
  27.             msg = msg + "地址:" + std.Address;
  28.  
  29.             MessageBox.Show(msg, "學生基本資料");
  30.         }

二月 01

列舉、結構、類別的比較表

程式 沒有回應 »   瀏覽人數:[ 754user+671bot ]
enum struct class
中文意義 列舉 結構 類別
成員資料型別 受限制、而且只能為整數型別 不受限制 不受限制
叫用方法 直接輸入列舉名稱 宣告結構變數 宣告類別變數
使用 static 修飾詞
包含事件及方法
介面實作
結構函式
型別系統 Value Type Value Type Reference Type
預設傳遞參數方式 Call by Value Call by Value Call by Reference
實體存放記憶體在Stack或Heap Stack Stack Heap
欄位初始設定式
指派成員內容值 可以,只能整數
功能 簡單 普通 較強

 

結構 (struct) 宣告方式:

[存取修飾詞] struct [結構名稱]
{
  [存取修飾詞] [資料型別] [變數名稱];
  [存取修飾詞] [資料型別] [變數名稱];
  ...
}

 

列舉 (enum) 宣告方式:

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