顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2012年6月7日 星期四

C# 存取修飾詞 public, protected, private, internal, protected internal 的區別


public
型別或成員可由相同組件或參考該組件的另一個組件中的任何其他程式碼存取。
protected
型別或成員只能由相同類別或結構中,或是衍生類別中的程式碼存取
private
型別或成員只能由相同類別或結構中的程式碼存取。
internal
型別或成員可由相同組件中的任何程式碼存取,但是不包括其他組件中的程式碼。
protected internal
型別或成員可由相同組件中的任何程式碼,或是其他組件中的任何衍生類別存取。



節錄自:

2012年6月1日 星期五

C# 繼承


要 C# 中做到跟 Delphi 以下 inherited 一樣效果,C#作法測試說明:

type
  TfrmPrnSuCount1 = class(TfrmPrnList)
:
:
procedure TfrmPrnSuCount1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  //此指令,會呼叫 基底Form 
  //frmPrnList.QuickRep1BeforePrint()執行後
  //再回來往下執行
  inherited; 

  case g_iMode of
    0:  //全部列印
    begin
      QRLabel5.Caption:= '列印範圍:全部列印';
    end;
    1:  //日期範圍
    begin
      QRLabel5.Caption:= 
        '列印範圍:'+ 
        C_StoC(g_sBdate)+ '~'+ 
        C_StoC(g_sEdate);
    end;
  end;
end;


------------------------------
使用了 Virtual 配合 Override 的變通應用


namespace GISTools
{
    //基底Form frmAsk
    public partial class frmAsk : Form
    {
        public frmAsk()
        {
            InitializeComponent();
        }


        //確定按鈕
        public virtual void btnOk_Click(object sender, EventArgs e)
        {
            //btnOk.DialogResult = DialogResult.OK;
            MessageBox.Show("ASK 基底Form!!");
        }
    }
:
:
    //繼承Form frmM301, 繼承自frmAsk
    public partial class frmM301 : GISTools.frmAsk
    {
        public frmM301()
        {
            InitializeComponent();
        }


        //確定按鈕
        //三種不同結果測試
        //第一種:只會秀"ASK 基底Form!!"
        //new public void btnOk_Click(object sender, EventArgs e)
        //{
        //    MessageBox.Show("M301 World!!");
        //}




        //第二種:只會秀"M301 World!!"
        //public override void btnOk_Click(object sender, EventArgs e)
        //{
        //    MessageBox.Show("M301 World!!");
        //}




        //第三種:會先秀"ASK 基底Form!!",
        //      再秀 "M301 繼承Form!!"
        public override void btnOk_Click(object sender, EventArgs e)
        {
            //因為基底frmAsk.btnOk_Click()用了Virtual, 
            //無法再用static, 故要先把物件實體化才能用
            frmAsk frmAsk1 = new frmAsk();  
            frmAsk1.btnOk_Click(sender, e);
            frmAsk1.Dispose();


            MessageBox.Show("M301 繼承Form!!");
        }
    }
}

---
Welly

2012年5月12日 星期六

.NET使用NPOI Library開發Server端不須安裝Office但能存取Office檔案程式


在 Server 端存取 Excel 檔案的利器:NPOI Library



Codeplex 軟體套件(Package)資訊
套件名稱NPOI
作者tonyqus, huseyin, atao
目前版本1.2.1 Stable(正式版)
URLhttp://npoi.codeplex.com/
使用難易度
使用此套件時可用的輔助工具Visual Studio 2008
POIFS Browser 1.2
基礎知識基本物件導向。
Excel 基礎操作。

在 Server 端控制 Excel 的難處

在今日 Microsoft Excel 被廣為業界接受之際,Excel 已幾乎是每個人必會的工具,不論是在校園或是職場,接觸到 Excel 的機率很高,而且 Excel 靠著簡單易用以及高度容錯的能力,讓使用者可以近乎無痛的操控 Excel,它內建的強大試算以及資料整理的功能,也讓很多使用者樂於使用它,這一點由 Excel 的高市佔率得以印證,用 Excel 來整理與包裝資料已經是司空見慣的事,因此很多的使用者會利用它來處理日常的業務資料或是基本檔等等,不過這可就苦了 IT 人員了。
在論壇上經常會看到一種需求,因為使用者不論如何都要用 Excel 檔來放資料,所以總是要求 IT 人員在系統中直接產出 Excel 檔案直接下載給使用者,目前由官方公布,由伺服器端存取 Excel 表格兩種方法:

2011年11月29日 星期二

C# Convert.ToDouble() 與 double.TryParse() 使用比較



  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "";              
  6.             // 如果str為空字串,則會跳到異常處理:輸入字串格式不正確  
  7.             Console.WriteLine(Convert.ToDouble(str));              
  8.          }  
  9.          catch (Exception ex)  
  10.          {  
  11.             Console.WriteLine(ex.Message);  
  12.          }  
  13.          Console.ReadLine();  
  14.       }  

以上程式碼出現的結果為:輸入字串格式不正確。因為傳入的字串為空,轉換成 double 類型不成功。


  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "123.123";              
  6.             // 如果str為空字串,則會跳到異常處理:輸入字串格式不正確  
  7.             Console.WriteLine(Convert.ToDouble(str));              
  8.          }  
  9.          catch (Exception ex)  
  10.          {  
  11.             Console.WriteLine(ex.Message);  
  12.          }  
  13.          Console.ReadLine();  
  14.       } 


隨便對 str 給予一個合適的值,程式不會出現錯誤,也可得到結果為:123.123


下面改用另外一種 double.TryParse() 方式處理:
第一種情況仍是將 str 設為空字串,



  1. static void Main(string[] args)  
  2.     {  
  3.        try  
  4.        {  
  5.           string str = "";  
  6.           double rst = 0.0;  
  7.           Console.WriteLine("转换结果为:" + double.TryParse(str, out rst));  
  8.           Console.WriteLine(rst);              
  9.        }  
  10.        catch (Exception ex)  
  11.        {  
  12.           Console.WriteLine(ex.Message);  
  13.        }  
  14.        Console.ReadLine();  
  15.     }  


程式碼執行不會出現錯誤,得到的結果為:
傳回結果:false
rst :0

第二種情況隨便對 str 給予一個合適的值:

  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "123.123";  
  6.             double rst = 0.0;  
  7.             Console.WriteLine("转换结果为:" + double.TryParse(str, out rst));  
  8.             Console.WriteLine(rst);              
  9.          }  
  10.          catch (Exception ex)  
  11.          {  
  12.             Console.WriteLine(ex.Message);  
  13.          }  
  14.          Console.ReadLine();  
  15.       }  


程式碼執行不會出現錯誤,得到的結果為:
傳回結果:true
rst :123.123

由以上的測試結果可以看出。使用 double.TryParse() 做類型轉換更安全,
可以對傳回值進行判斷,也可以設置預設的傳回值 0 。


注意事項:
傳入的字串即便已是包含數字字元,但當您使用 TryParse 方法轉換某些數值的型別而言,仍然有可能是無效的。
例如,"256" 不是 byte 的有效值,但卻是 int 的有效值。
" "98.6" 不是 int 的有效值,但卻是 decimal 的有效值。
下列範例顯示如何使用 TryParse 與 long、byte 及 decimal 值的字串表示。


string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
  Console.WriteLine("number1 now = {0}", number1);
else
  Console.WriteLine("numString is not a valid long");

byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
  Console.WriteLine("number2 now = {0}", number2);
else
  Console.WriteLine("numString is not a valid byte");

decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
  Console.WriteLine("number3 now = {0}", number3);
else
  Console.WriteLine("number3 is not a valid decimal");  

節錄來源:http://msdn.microsoft.com/zh-tw/library/bb384043.aspx

Double.TryParse 方法 (String, NumberStyles, IFormatProvider, Double%)  文化特性格式說明。

節錄來源:http://msdn.microsoft.com/zh-tw/library/3s27fasw.aspx

---
Welly Lin