2012年10月25日 星期四

{C#} Dictionary Custom Key is class

如 Dictionary的key 值是客製,從class而來
如要讓Dictionary裡的key不重覆,需覆寫GetHashCode()與Equals(object obj)
Dictionary.ContainsKey() 才會有效果

EX:
Dictionary<ErrorData, string> dicTemp = new Dictionary<ErrorData, string>();
ErrorData er=new ErrorData();
er.CUR="abc";
er.Name="Jake";
if (!dicTemp.ContainsKey(er))
    dicTemp.Add(er,"good");


建立類別
  public class ErrorData
    {
        public string CUR{ set; get; }

        public string Name{ set; get; }

        public override int GetHashCode()
        {
            //return base.GetHashCode();
            return Name.GetHashCode() ^ CUR.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            ErrorData v1 = obj as ErrorData;
            return v1.PN == PN && v1.Currency == Currency;
        }
       
    }


參考資料:
http://www.cnblogs.com/pmars/archive/2012/03/02/2376610.html

2012年10月24日 星期三

{C#} enum 使用

//列舉排序的選項
    public enum Rank:int
    {
         中文, 中文二, 中文三
    }
列舉中各代表的數值(預設)
中文=0
中文二=1
中文三=2

//將一文字值轉為Enum
(Rank) Enum.Parse(typeof (Rank), Value);

//取得Enum的所有值
Enum.GetNames(typeof (Rank))
>>string[0] 中文 string[1] 中文二 string [2] 中文三

//宣告 rank變數為一個Enum Rank形態
                Rank rank=Rank.中文;
                switch ((int)rank)
                {
                    case 0://中文
                        return finalResult.OrderBy(s => s.Code).ToList();
                    case 1://中文二
                        return finalResult.OrderBy(s => s.Sourer).ToList();
                    case 2://中文三
                        return finalResult.OrderByDescending(s => s.AllYearCurrencyRate).ToList();
                }


參考資料:
http://www.dotblogs.com.tw/johnny/archive/2010/01/25/13300.aspx
http://diary.tw/tim/743

2012年10月18日 星期四

{JQuery} Autocomplete 進階應用-text、value值不同(像DropdownList)

autocomplete.aspx :
$("#<%=Txt.ClientID %>").autocomplete('Datasource.aspx', {
                noCache: true,
                lineSeparator: ",",//設定基準為Datasource.aspx中紅色資料連接符號
                //當資料被選擇時
                onItemSelect: findValue,
                onFindValue: findValue,
                //擴充參數給Datasource.aspx
                extraParams: {
                    MPSNo: function () {
                        return $('#<%=TxtVersionNo.ClientID%>').val();
                    }
                }
            });


  function findValue(li) {

                if (li == null) {
                    document.getElementById('<%=TxtItemName.ClientID %>').innerText = '';
                    document.getElementById('<%=TxtItemSpec.ClientID %>').innerText = '';
                }
                else {
                    document.getElementById('<%=TxtItemName.ClientID %>').innerText = li.extra[0];
                    document.getElementById('<%=TxtItemSpec.ClientID %>').innerText = li.extra[1];
                }
            }

Datasource.aspx:
 protected void Page_Load(object sender, EventArgs e)
    {

        var query = "";
        var mpsNo = "";
        if (!string.IsNullOrEmpty(Request.QueryString["q"]))
            query = Request.QueryString["q"].ToUpper();
        if (!string.IsNullOrEmpty(Request.QueryString["MPSNo"]))
            mpsNo = Request.QueryString["MPSNo"];
        var modelList = new PMOperator().ReadPNAuotcompleteDataSource(query, mpsNo).Take(10).ToArray();

        var count = modelList.Count();
        string[] str = new string[count];
        for (int i = 0; i < count; i++)
        {
            if (i == count - 1)
            str[i] = string.Format("{0}|{1}|{2}", modelList[i].PN, modelList[i].PNName, modelList[i].PNSpec);
            else
            {
                str[i] = string.Format("{0}|{1}|{2},", modelList[i].PN, modelList[i].PNName, modelList[i].PNSpec);
            }
        }
        Response.Write(string.Join(Environment.NewLine, str));
    }


PS.
當使用extraParams屬性擴充參數時,autocomplete.js對下列的寫法,會產生問題
MPSNo: function () {
                        return $('#<%=TxtVersionNo.ClientID%>').val();
需將autocomplete.js檔中makeUrl(q) function 修改下段程式碼 (主要是紅字部分):

    function makeUrl(q) {
        var url = options.url + "?q=" + escape(q);
        $.each(options.extraParams, function (key, param) {

            url += "&" + key + "=" + (typeof param == "function" ? param() : param);

        });
        return url;
    };


參考資料:
http://forums.asp.net/t/1830016.aspx/1
http://blog.darkthread.net/post-2009-07-10-jquery-autocomplete-sample.aspx
http://jsgears.com/viewthread.php?tid=114&extra=&page=1

API:
http://api.jqueryui.com/autocomplete/#entry-examples

{Linq} 當取第一筆取不到時,預設值自訂

有時要去資料庫查某個條件下
是否有筆數,當有筆數要取第一筆
如筆數為零,則帶空值回來
可使用「.DefaultIfEmpty()」來設定
當值為空的時候要給什麼資料

service.functionName().Where(s=>s.Id==No).Select(s=>s.Name).DefaultIfEmpty('').First();


FirstOrDefault()的預設值為NULL
故要使用 DefaultIfEmpty()輔助設定預設值,以避免回傳Null值
msdn上寫到......
http://msdn.microsoft.com/zh-tw/library/bb340482.aspx


參考資料:
http://msdn.microsoft.com/zh-tw/library/bb340482.aspx

2012年10月5日 星期五

{JavaScript} html-select option Postback後指定選取


Html:

<select name="ddlNo" id="ddlNo" style="width: 10%">
<% var No= ViewState["No"] as List<string>;%>
<% if (No!= null) %>
<% { %>
<%=         "<option value=''></option>"%>
<%      foreach (var item in No)%>
<%      { %>
<%=         "<option value=" + item + ">" + item + "</option>"%>
<%      } %>
<% } %>
</select>

C#:
//用一個Hidden將被選取的值記錄下來,以供PostBack後重新Load畫面給JS判斷用
string No = Request.Form["ddlNo"];
HiddenselectNo.Value = No ;


JS:
if ($('#<%=HiddenselectNo.ClientID%>').val() != '') {
                var selectObj = $('#ddlNo')[0];
                for (var i = 0; i < selectObj.length; i++) {
//當值相同時,則被選取,否則為False;預設是第一個是被選取
var selectObj = $('#ddlSupplierNo')[0];
for (var i = 0; i < selectObj.length; i++) {
    if (selectObj[i].text == $('#<%=HiddenselectNo.ClientID%>').val())
        selectObj[i].selected = true;
    else
        selectObj[i].selected = false;
}


參考資料:
http://www.xiaoxiaozi.com/2010/08/17/1856/

2012年10月2日 星期二

{C#} Code Behind、Code File、Code Inline

Code Behind--
建立Code Behind的.cs檔案,通常在建立asp.net的網頁會自動出現,也就是說「預設」就是Code Behind,做到code tag 分離,經過「三點式分離」「關注點分離」的洗禮,就覺的是一個三小的名詞,而code behind大概就是原始時代的分離法,而此頁面需要繼承Basepage ,而這個Basepage 也是相當的複雜,也延申程式碼會非常的多。

Code Inline--
而與他相匹的就是Code Inline(單一檔案)
Code Inline就是把程式碼寫在aspx檔案裡,就像回到了asp時代,但沒人說古時候就不好,這樣的程式簡潔有力。

Code File--
而在查Code Behind時,也查到另一個屬性,就是Code File,這個曾經取代Code Behind的屬性當初與Code Behind的差異就是將程式碼另寫在Code File 的.cs檔案中,並放置Server上呼叫到時才去編譯,而非Code Behind先編譯成dll 去運行。

現行的asp.net 3.5~4.5 以Code Behind為「預設」


Code Behind:將檔編譯成dll檔執行;asp.net 1.1版本
Code File:cs檔上傳到Server編譯;asp.net 2.0的版本

Code Inline:在aspx上
<script type="text/C#" runat="server">
protected  void Page_Load(object  sender,EventArgs e)
{
    Response.Write("abc");

}
</script>

參考資料:
http://blog.miniasp.com/post/2008/12/23/ASPNET-Code-Behind-and-Code-Inline-Tips-in-Visual-Studio.aspx
http://blog.sanc.idv.tw/2011/07/codebehindcodefile.html
http://atic-tw.blogspot.tw/2012/05/code-inline.html

2012年10月1日 星期一

{工具}HightChart 圖表套件

圓餅圖實例:
xxx.cs >>
//資料來源
var newData =ReadResult;
//資料轉為Json
data = new JavaScriptSerializer().Serialize(newData.Data);
 HiddenField1.Value=data;
//被統計項目
returnValue = new JavaScriptSerializer().Serialize(newData.Title);

xxx.aspx >>
<script type="text/javascript">
        var chart;
        $(document).ready(function () {
//解析資料來源
            var dataArr=new Array();
            if ($('#<%=HiddenField1.ClientID%>').val() != '') {
                dataArr = JSON.parse($('#<%=HiddenField1.ClientID%>').val());
                }
            var categories = <%=returnValue %>;
            var data=new Array();
            for(i=0;i<dataArr.length;i++)
            {
                data.push({name:categories[i],y:dataArr[i]});
            }

       //開始畫圖   
            chart = new Highcharts.Chart({
                chart: {
                    renderTo: 'container',
//圓餅圖表
                    defaultSeriesType:'pie'
                },
                title: {
                    text: 'High Chart'
                },
                xAxis: {
                    categories: <%=returnValue %>
                },
                tooltip: {
                    pointFormat: '{series.name}: <b>{point.percentage}%</b>',
                    percentageDecimals: 1
                },
                plotOptions: {
                pie: {
                    allowPointSelect: true,
                    cursor: 'pointer',
                    dataLabels: {
                        enabled: true,
                        color: '#000000',
                        connectorColor: '#000000',
                        formatter: function() {
                            return '<b>'+ this.point.name +'</b>: '+ this.percentage +' %';
                        }
                    }
                }
            },
                series: [{ data: data}]
            });

        });
       
      
    </script>




http://www.highcharts.com/demo/line-log-axis

相關範例∶
http://www.dotblogs.com.tw/lastsecret/archive/2011/01/30/21137.aspx
http://www.cnblogs.com/jsonzheng/archive/2011/05/13/2045344.html

長條圖:
http://www.cnblogs.com/jsonzheng/archive/2011/01/18/1938489.html

API:
http://api.highcharts.com/highcharts#title

{C#} ViewState 出現未將xx序列化問題

當將一集合傳給Viewstate資料來源時,
如是用自定義類別產成之集合,會出現類似下列的錯誤訊息

未將型別 'FormJSON' 標記為可序列化


 ViewState內的資料,只是傳化為畫面上隱藏欄位
<input type="hidden" value=".....">
 故要將自定類別轉為序列化狀態

public void Page_Load()
{
    var serializer = new JavaScriptSerializer();
    var itemsResult = serializer.Deserialize<FormJSON>(FormDataSource.Value); 
}



[Serializable]
        public class FormJSON
        {
            public int FormId { set; get; }

            public string Title { set; get; }

        }


 參考資料:
http://w3937.pixnet.net/blog/post/78687168-%5Basp.net%5D-%E5%88%A9%E7%94%A8viewstate%E4%BF%9D%E5%AD%98%E8%87%AA%E8%A8%82%E7%89%A9%E4%BB%B6

{Note} Url的編碼


Url編碼:ASCII碼,如非ASCII字元,則會因瀏覽器支援的字元集不同而產成亂碼或其問題

詳細說明:
http://www.189works.com/article-42584-1.html