只有累積,沒有奇蹟

2018年8月31日 星期五

[C#] 計算字串的長度方式

摘要:C# 計算字串的長度方式
怕之後年紀大會忘記,趕緊記下來先
.NET Framework 中有內建類別(Encoding )取得字串的長度 
想要取得字串中是否含有中文字串的實際長度,有下列作法 
Ⅰ、Length:取得目前 String 物件中字元的數目,僅計算字串長度(中文 2 byte,英文 1 byte)
Ⅱ、GetByteCount:計算編碼一組字元所產生的位元組數目(判斷多少位元組會編碼一組 Unicode 字元)
Ⅲ、GetBytes:計算解碼位元組序列所產生的字元數目(執行實際的編碼作業)
PS:記得先參考 System.Text 
《範例》
string myString = "讓你媽媽NEW一下";
// Length
Response.Write("Length:" + myString.Length);

// GetByteCount:使用目前系統的編碼方式
Response.Write("GetByteCount:" + Encoding.Default.GetByteCount(myString));

// GetBytes
Response.Write("GetBytes:" + Encoding.Default.GetBytes(myString).Length.ToString());

int myStringCount = 0;
for (int i = 0; i < myString.Length; i++)
{
  byte[] tIntByte = Encoding.Default.GetBytes(myTextBoxText.Substring(i, 1));
                
  // 中文字
  if (tIntByte.Length == 2)
  {
    //To Do Something
  }

  myStringCount += tIntByte.Length;
}
Response.Write("GetBytes(FOR):" + myStringCount.ToString());
《結果》
另外需要注意的一點,如果你是使用 GetBytes 計算字串長度的話
需要注意網頁編碼的方式,有可能因為編碼方式的不同,使用 GetBytes 時會有不同的結果
所以如果取得的字串長度跟你想像中的有差異,可以檢查看看網頁編碼的方式喔!
《範例》
Response.Write("GetBytes(big5):" + Encoding.GetEncoding("big5").GetBytes(myString).Length.ToString());
Response.Write("GetBytes(utf-8):" + Encoding.GetEncoding("utf-8").GetBytes(myString).Length.ToString());
《結果》
參考:
有問題請多多指教,謝謝 :D

2018年8月18日 星期六

[.NET] 行事曆控制項(ASP.NET calendar)加上農曆日期

摘要:行事曆控制項加上農曆日期
在C#中要如何計算農曆日期?
在 System.Globalization namespace底下,裡面有包含各種曆法的類別
包括台灣(TaiwanCalendar)、日本(JapaneseCalendar)、韓國(KoreanCalendar)...等各國曆法
以下簡單的介紹使用的方式,將ASP.NET 行事曆控制項加上農曆日期顯示
-----------------------------------------------我是分隔線------------------------------------------------------------
Calendar.cs

protected void Page_Load(object sender, EventArgs e)
{
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            // 建立農曆類別實體
            TaiwanLunisolarCalendar myTaiwan = new TaiwanLunisolarCalendar();
            // 取得對應到的農曆月&日
            int myMonth = myTaiwan.GetMonth(e.Day.Date);
            int myDay = myTaiwan.GetDayOfMonth(e.Day.Date);

            string myLunisolarDate = string.Format("
{0}/{1}", myMonth, myDay);
            string myLunisolarDateToolTip = string.Format("農曆 {0}月{1}日", myMonth, myDay);;

            Label myLabel = new Label();
            myLabel.Text = myLunisolarDate;
            myLabel.ForeColor = System.Drawing.Color.Blue;
            myLabel.Font.Size = FontUnit.XSmall;
            myLabel.ToolTip = myLunisolarDateToolTip;
            
            e.Cell.Controls.Add(myLabel);
        }
最後顯示的畫面
參考
有問題請多多指教,謝謝 :D

2018年8月17日 星期五

[筆記] Web Service 概述

Web Services是一種軟體服務,它透過Web通訊協定及資料格式的開放式標準(例如 HTTP、XML 及 SOAP等)來為其他應用程式或異質系統提供服務,或進行資料交換” From 資策會

Web Service 是以Web的標準為基礎,其中最基本的是HTTP+XML。Web Service 由四個核心元件所組成,分別是XML、SOAP、WSDL和UDDI,如下圖所示
UDDI:Universal Description, Discovery and Integration
WSDL:Web Services Description Language
SOAP:Simple Object Access Protocol
XML&HTTP
什麼是Web Service
“Web Services是一種軟體服務,它透過Web通訊協定及資料格式的開放式標準(例如 HTTP、XML 及 SOAP等)來為其他應用程式或異質系統提供服務,或進行資料交換” From 資策會
舉例來說,假設今天要檢查輸入資料e­-mail的格式正確性(正確、可以用的e-mail格式,如abc@def.ghi就不是合法的e-mail格式),可以在專案中加入Web參考,參考http://www.webservicex.com/ValidateEmail.asmx?WSDL,呼叫Web Service使用其中IsVaildEmail方法,來檢查e-mail的正確性。網路上有提供很多免費的Web Service可以使用,詳細可以參考 xmethods

Web service 核心元件
Web Service 是以Web的標準為基礎,其中最基本的是HTTP+XML。Web Service 由四個核心元件所組成,分別是XML、SOAP、WSDL和UDDI,如下圖所示
Web service

UDDIUniversal Description, Discovery and Integration
統一描述、發現和集成的縮寫,它是一個基於XML的跨平台的描述規範,可以使世界範圍內的企業在網際網路上發布自己所提供的服務– UDDI @ wiki
由WS-I組織所定義的登錄服務技術,企業可以使用它對Web Service註冊與搜尋。也可以透過此服務找到其他公司的提供的Web Service服務。
WSDLWeb Services Description Language
描述Web服務發布的XML格式 – WSDL @ wiki
描述Web Service。敘述服務所提供的項目或方法,以及使用者如何與Web Service溝通及互動,哪些方法可以呼叫?溝通時所需要使用的參數、參數格式…等。WSDL也是以XML來定義。
SOAPSimple Object Access Protocol
簡單物件存取協定。是一種標準化的通訊規範,主要用於Web Service服務中 – SOAP @ wiki
是一個簡單的基於 XML的協議,透過標準的通訊協定 SOAP 作為溝通管道,與 Web Service進行溝通,並使用所提供的服務。
XML&HTTP
讓不同程式透過HTTP通訊協定,以XML格式互相交換彼此的資料,使其與程式語言、平台和硬體無關,實現跨平台、跨語言、跨Internet的整合目的。

Web service 基礎の結構
Architecture
以下為參考MSDN XML Web Service概論
  • 目錄 
    XML Web Service 目錄提供尋找其他組織所提供之 XML Web Service 的中心位置。如 UDDI 登錄這類的 XML Web Service 目錄會擔任這個角色。XML Web Service 用戶端不一定會參考 XML Web Service 的目錄。
  • 探索
    XML Web Service 探索是尋找或探索一或多份相關文件的處理序,這些文件會使用 Web 服務描述語言 (WSDL) 來描述特定的 XML Web Service。DISCO 規格會定義尋找服務描述的演算法。如果 XML Web Service 用戶端知道服務描述的位置,則可以略過探索處理序。
  • 描述 
    為了讓人瞭解如何與特定 XML Web Service 互動,您必須提供服務描述來定義 XML Web Service 所支援的互動方式。XML Web Service 用戶端必須知道如何與 XML Web Service 互動,才能使用它。
  • Wire格式
    為了達到通用通訊的目的,XML Web Service 會使用開放式 Wire 格式進行通訊,這些格式是任何支援最常見 Web 標準的系統(如HTTP POST和HTTP GET標準通訊協定),均可理解的通訊協定。SOAP 是用於 XML Web Service 通訊的關鍵通訊協定。

Web service 運作の方式
以下描述Web Service所發生的事件順序:
  1. 使用者透過瀏覽器瀏覽網頁,執行Client端應用程式(.aspx page),會建立Web Service Proxy類別的新執行個體,並(invokes)叫用Proxy上的方法。
  2. 使用者Proxy Object物件將參數序列化(serializes)成SOAP訊息(XML格式),並透過網路將SOAP訊息傳送到Web Service。
  3. Web Service 收到後,還原序列化(deserializes)接收到的SOAP訊息。並建立實做相關類別執行個體,叫用對應的方法,傳入還原序列化後的XML當作參數,並執行其程式碼,最後設定傳回值、以及輸出參數。
  4. Web Service Object將其傳回值序列化(serializes)成SOAP訊息,並透過網路將其回傳給使用者。
  5. 使用者電腦接收到Web Service的XML SOAP訊息後,還原序列化(deserializes)接收到的XML資料,取得傳回值,傳給使用者Proxy Object的執行個體
  6. 使用者收到執行後的傳回值資料。
PS:運作方式內容有做修正,感謝小朱大的熱心提醒!

Web service 使用方式
有關Web Service 使用方法在網路上有很多前輩有分享,這裡就不在說明(因為寫的沒有別人好,就不獻醜了 XD)

補充
有關Web Service 還有很多相關的議題與資訊,先在此列出來,方便之後有時間在研究

參考
此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導
如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝 :D
Web Services 入門(推薦)

2018年8月9日 星期四

[C#] Checkbox InputAttributes 屬性

如何註冊Checkbox的屬性?
 這問題對ASP.NET開發者來說是很簡單的問題,舉例來說,想要在CheckboxList控制項註冊「disabled」屬性,可透過下列的方式
checkbox.Attributes.Add("disabled", "disabled");
寫完透過IE預覽沒問題,但…今天如果是用其他瀏覽器測試的話,會跟我們想的不太一樣
如下圖所示
checkbox
透過上圖可以發現,並不是所有的瀏覽器瀏覽的呈現效果都跟IE一樣(還是IE太強大?)
不希望CheckboxList讓使用者勾選,總不能IE不能勾但其他瀏覽器可以勾…這樣好像怪怪的
使用Attributes.add來自訂控制項自訂的屬性在別的瀏覽器失敗了嗎!
打開網頁原始碼
<table id="CheckBoxList1" border="0" style="font-family:Comic Sans MS;">

 <tr>

  <td><span disabled="disabled"><input id="CheckBoxList1_0" type="checkbox" name="CheckBoxList1$0" disabled="disabled" /><label for="CheckBoxList1_0">Inter Explorer</label></span></td>

 </tr><tr>

  <td><span disabled="disabled"><input id="CheckBoxList1_1" type="checkbox" name="CheckBoxList1$1" disabled="disabled" /><label for="CheckBoxList1_1">FireFox</label></span></td>

 </tr><tr>

  <td><span disabled="disabled"><input id="CheckBoxList1_2" type="checkbox" name="CheckBoxList1$2" disabled="disabled" /><label for="CheckBoxList1_2">Chrome</label></span></td>

 </tr>

</table>
  這時才發現原來Render在網頁上的方式跟自己所想的不一樣,ASP.NET在呈現CheckboxList或是包在GridView的Checkbox控件時,會在每一筆Checkbox外層加上<span>的Tag,當你透過後端程式註冊屬性時,註冊的屬性是加在Checkbox外層的span上,透過上圖可以清楚瞭解,原本註冊在Checkbox的「disabled」屬性,透過ASP.NET Render後,最後註冊在Checkbox外層的span中,這也難怪Chrome與Firefox認不出來(忍不住說,IE好神!)

解決方法
1. 使用Checkbox InputAttributes屬性:透過此屬性,可以正確的在checkbox設定你想自訂的值(System.Web.UI.WebControls

CheckBox1.InputAttributes.Add("disabled", "disabled");

2. 使用 HtmlInputCheckBox 控件:產生HTML <input type= checkbox> 項目(System.Web.UI.HtmlControls
透過以上兩種方法,就可以解決此問題!

參考

2018年8月7日 星期二

[.NET] Calendar 選擇同一天時不會觸發 SelectionChanged事件

前言
    有A、B兩個網頁,A網頁按下日期選擇按鈕後,會跳出B網頁,提供使用者選擇日期後在將選擇的日期(透過日曆控制項的SelectionChanged事件裡)帶回A網頁欄位中。在測試中發現有一點很特別的,假設A網頁帶給B網頁的日期與B網頁日曆選擇日期是同一天時(就是A網頁日期是2011/6/12,B網頁日曆控制項預設日也是2011/6/12,但B網頁日曆選擇2011/6/12將不會把2011/6/12值回傳給A網頁),檢查後發現,Calendar控件會觸發PostBack事件,但選擇同一天就不會觸發SelectionChanged事件。

處理方式
MSDN Calendar事件中有沒有類似OncClick的事件可以使用。為了要不被發現有bug解決此問題,可以透過下列三種方式解決:
  • 將Calendar控制項預設日期設為1900/01/01
  1. 首先在Page_Load時,將Calendar控制項選擇的日期設為1900/01/01(改預設日期,設定Calendar可以觸發SelectionChanged事件)
  2. 接下來在Day_DayRender事件中,找到A網頁傳來的日期,設定字體顏色跟背景色,讓使用者認為該日期有被選擇(製造使用者錯覺)
  3. 完成上述步驟,即使選擇同一天時,也會觸發SelectionChanged事件。請參考下列Code

protected void Page_Load(object sender, EventArgs e)
{   
    if (!IsPostBack)
    {
        // 預設將選擇日期為1900/1/1
        Calendar1.SelectedDate = new DateTime(1900,1,1);
     // Arwind 大大提醒還有此方法可以使用
     Calendar1.Selected.Clear();

    }
}

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
    DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
    // 設定選擇日期的顏色Style
    if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
    {
        e.Cell.BackColor = System.Drawing.Color.FromName("#6699FF");
        e.Cell.ForeColor = System.Drawing.Color.White;
    }
}

  • 不給你選同一天
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,拿掉該日期的連結(e.Cell.Text = e.Day.DayNumberText),讓使用者沒辦法選該日期。
  3. 請參考下列Code

protected void Page_Load(object sender, EventArgs e)
{
    Calendar1.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
}

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
    DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());

    // 拿掉同一天的連結
    if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
    {
        e.Cell.Text = e.Day.DayNumberText;
    }
}
  • 同一天註冊Javascript 
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,註冊Javascript事件,設定如果選到同一天,就透過Javascript 方法將該日期回傳給A網頁(或是直接導回A網頁也可以)。
  3. 請參考下列Code

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Calendar2.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
    }
}

protected void Calendar2_DayRender(object sender, DayRenderEventArgs e)
{
    DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());

    // 按下同一下就導頁
    if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
    {
        string myReturnJS = string.Format("return Redirect('" + mySelectedDate.ToString("yyyy/MM/dd") + "');");                 
        e.Cell.Attributes.Add("onclick", myReturnJS);
    }
}
JS

function Redirect(pSelectedDate) {
            location.href = "Default.aspx?Date=" + pSelectedDate;
            return false;
        }
參考
以上三種方法都可以達到目的,可以根據不同的情況來做運用(個人淺見),如果各位有發現更好的解決方法,麻煩請跟我說一聲,我會在將方法補上,謝謝 :D

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com