2013年12月27日 星期五

{C#} 加解密Get Url 參數

原貌:http://abc.com.tw?_do=ABCDDAFDA==

#region 解加密過的參數
        private static string decode(String strData)
        {

            try { return System.Text.UTF8Encoding.UTF8.GetString(System.Convert.FromBase64String(strData)); }
            catch { return ""; }
        }
        private static Hashtable QueryValue(string _do)
        {
            _do = decode(_do);
            string[] s = _do.Split('&');

            Hashtable ht = new Hashtable();

            for (int i = 0; i < s.Length; i++)
            {
                if (s[i].IndexOf("=") > 0)
                {
                    string key = "";
                    string values = "";
                    key = s[i].Substring(0, s[i].IndexOf("="));
                    values = s[i].Substring(s[i].IndexOf("=") + 1);
                    ht.Add(key, values);
                }
            }
            return ht;
        }
        public static string GetQueryStringByKey(string pKey, string queryString)
        {
            Hashtable do_ht = QueryValue(queryString);
            return do_ht.ContainsKey(pKey) ? do_ht[pKey].ToString() : "";
        }
        #endregion

#region 加密
private static string encode(String strData)
        {
            try { return System.Convert.ToBase64String(System.Text.UTF8Encoding.UTF8.GetBytes(strData)); }

            catch { return ""; }

        }
        public static string GetCustNe(string pCustomerName)
        {
            return "?_do=" + encode("CustNe=" + pCustomerName);
        }
#endregion

參考資料:http://www.dotblogs.com.tw/joumingt/archive/2009/07/09/9271.aspx

2013年9月11日 星期三

{C#} Gridview 動態建立ITemplate

 class LinkColumn : ITemplate
        {
            public void InstantiateIn(System.Web.UI.Control container)
            {
                LinkButton link = new LinkButton();
                link.ID = "link";
                container.Controls.Add(link);
            }
        }
        private void CreateWoLinkColumn(string headerText)
        {
            var column = new TemplateField() { HeaderText = headerText };
            column.ItemTemplate=new LinkColumn();
            column.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
            column.HeaderStyle.Wrap = false;
            MainDG.Columns.Add(column);
        }
//Page_init叫用
protected void Page_Init(object sender, EventArgs e)
        {
            CreateWoLinkColumn("aa");
        }

*動態生成Template 因每次Postback時,會重跑Page_Load function,故在第一次生成動態Template時,需寫在Page_Init 以保存控制項,爾後要取控制項的值才FindControl的到

*Page 生命週期:PreInit=>Init=>InitComplete=>PreLoad=>Load.....


參考資料:
http://blog.sina.com.cn/s/blog_8038620001012s9d.html

{C#} 取一整年 目前的週數

CultureInfo info = CultureInfo.CurrentCulture;
                //周一為新的一週;
                int iweekdNo = info.Calendar.GetWeekOfYear(DateTime.Now,CalendarWeekRule.FirstDay,DayOfWeek.Monday);

CalendarWeekRule列舉:
FirstDay    指示一年的第一週開始於該年的第一天,並結束於被指定為該週第一天的前一天。 該值為 0。
FirstFullWeek    指示一年的第一週開始於,一年的第一天當天或之後被指定為一週第一天的那天。
FirstFourDayWeek    指示一年的第一週有四天以上在被指定為該週的第一天之前。

FirstFullWeek Ex:
1/1 周五 設一週第一天為周日
=>第一周第一天日期為1/3(日)
1/1 周二 設一週第一天為周日
=>第一週第一天日期為1/1(二)



參考資料:
http://kevintsengtw.blogspot.tw/2011/09/blog-post_29.html#.Ui_AucanpBh
http://msdn.microsoft.com/zh-tw/library/system.globalization.calendarweekrule.aspx

2013年7月4日 星期四

{C#} Progressbar(JQuery UI) 搭配Ajax

搭配Ajax取資料其間 進度條展示
//CSS樣版
<style>
    .progress-label {
            float: left;
            margin-left: 50%;
            margin-top: 5px;
            font-weight: bold;
            text-shadow: 1px 1px 0 #fff;
        }

</style>
<script>
 $(function () {
//設定Progressbar
            var progressbar = $("#progressbar"),
            progressLabel = $(".progress-label");
            progressbar.progressbar({
                value: false,
                change: function () {
                    progressLabel.text(progressbar.progressbar("value") + "%");
                },

                complete: function () {
                    progressLabel.text("Complete!");
                }
            });
            var intervalID = setInterval(progress, 250);
           //觸發Read ajax
                        var strURL = "source.ashx";
                        $.ajax({
                            type: 'GET',
                            data: { parms: Math.random() },
                            url: strURL,
                            contentType: "application/json; charset=utf-8",
                            dataType: 'json',
                            error: function () {
                                alert('Ajax request 發生錯誤');
                            },
                            success: function (result) {
                                $("#progressbar").progressbar("value", 100);
                                $("#progressbar").hide();
                             
                            }
                        });
});
 function progress() {
                var val = $("#progressbar").progressbar("option", "value")
                if (val < 100) {
                    $("#progressbar").progressbar("value", val + 1);
                }
            }
</script>

<div id="progressbar"></div>



參考資訊:
http://horacerobot.blogspot.tw/2010/12/jquery-ajax-mvc-jquery-ui-progress-bar.html
http://jqueryui.com/progressbar/#label


{SQL} Group by 年月

Group by 年 與 月:
SELECT ItemId,SUM(QTY),year(Date) as year, month(Date) as month
  FROM abcTable
  where ItemId='8687'
  group by ItemId,year(Date) ,month(Date)
  order by year desc


參考資訊:
http://www.wretch.cc/blog/five/9184368

2013年6月25日 星期二

{C#} TextBox ReadOnly Postback取不到值

Control中,如使用ReadOnly,在Post back時會取不到值的問題

.net Control--
<asp:TextBox ID="abc" runat="server"  Readonly=true ></asp:TextBox>
html Control--
<input type="text" id="abc" name="abc" readonly="readonly" />

解決方式:
在Load Page 時將控制項屬性加入,
不在.aspx就先設定,可避免Post Back 時Viewstate Control值不被改變而導致取不到回寫值
 if (!IsPostBack)
            {
                txtReceivingDate.Attributes.Add("readonly", "readonly");
            }


參考資訊:
http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/21/textbox-readonly-and-disabled.aspx
http://www.dotblogs.com.tw/newmonkey48/archive/2009/11/08/11479.aspx

2013年6月5日 星期三

{C#} yield 使用

Yield
Foreach 中使用

//逐一帶出Enumerable 內資料 並回傳IEnumerable<class>  型態結果
foreach (var aa in IEnumerable)
{
    yield return new class{
       orderNo=aa.orderNo,
       ProductName=aa.ProductName
    }
}

//只帶回第一筆資料
foreach (var aa in IEnumerable)
{
    return new class{
       orderNo=aa.orderNo,
       ProductName=aa.ProductName
    }
}

//當訂單號碼為1,就會結束迴圈
foreach (var aa in IEnumerable)
{
    if(aa.OrderNo==1)
       yield break;
}

PS.
1.Yield break;可在Try catch 中,但不可在Finally中
2.Yield return;不可在Try catch中,但可在Try-finally 的Try中

參考資訊:
http://www.dotblogs.com.tw/hatelove/archive/2012/05/10/introducing-foreach-ienumerable-ienumerator-yield-iterator.aspx
http://msdn.microsoft.com/zh-tw/library/9k7k7cf0.aspx
http://www.dotblogs.com.tw/dc690216/archive/2010/02/19/13697.aspx

2013年6月4日 星期二

{Linq} 相同Group 中資料分隔

Data:
Name No Qty
A        1     50
A        2     60
B       12    10
C       13    70

Result:
A  1,2  110
B   12    10
C   13    70


var groupResult = data.ToLookup(s => s.Name);
string symbol=",";
foreach (var c in groupCPSPNResult)
{
    result.Add(new
   {
      Name= c.Key.Name,
      No= string.Join(symbol, c.Select(s => s.No).ToArray()),
      Total= c.Sum(s => s.Qty)
  });
}


參考資訊:
http://www.dotblogs.com.tw/dyco/archive/2010/08/25/17401.aspx

2013年5月14日 星期二

{C#} NPOI 進階-讀Excel 儲存格公式 取其結果方法

Excel的公式有很多種,有
1.日期型的公式
2.字串組合變化公式
3.純數值(儲存格數值)加總等公式
4.其他(還沒想到)

ps.NPOI版本為2.0
NPOI讀取公式類型的儲存格,其依以上不同而有不同的寫法

//每一格儲存格的資料類型為公式
//EX:Date('2010','4','1')、Sum($A1,$A2)、$A1 & $A2
if(hssfRow.GetCell(k).CellType==CellType.FORMULA)
{
     //由NPOI內提供的類別庫判斷公式結果類型

     IFormulaEvaluator iFormula = WorkbookFactory.CreateFormulaEvaluator(workbook);
     var formulaType = iFormula.Evaluate(hssfRow.GetCell(k)).CellType;
    //結果類型為數值(日期結果會被轉為數值)
     if (formulaType == CellType.NUMERIC)
    {
        ICell cell = iFormula.EvaluateInCell((hssfRow.GetCell(k)));
        // 判斷是否日期
         if (DateUtil.IsCellDateFormatted(cell))
           dr[k] = hssfRow.GetCell(k).DateCellValue;
         else
           dr[k] = hssfRow.GetCell(k).NumericCellValue;
    }
    //字串公式
    else if (formulaType == CellType.STRING)
       dr[k] = hssfRow.GetCell(k).StringCellValue;
    else
       dr[k] = hssfRow.GetCell(k).ToString();

}


參考資訊:
http://www.dotblogs.com.tw/smartleos/archive/2010/10/11/18284.aspx
http://tonyqus.sinaapp.com/archives/tag/excel-2007

2013年5月13日 星期一

{JavaScript} JS中資料轉Json格式中文成Unicode(\u...)問題

以下情況僅IE 8會發生..........以下解法經用IE 8測試OK

當在JS中將資料利用JSON.stringify()方式
轉為Json遇到中文時,會被成Unicode編碼

紅框為中文字

傳到後端會自動將Unicode解碼
但也可以手動在解碼一次

string factoryName = Regex.Unescape(jsonResult.FactoryName);
string lineName = Regex.Unescape(jsonResult.LineName);


前端的部分,JSON.parse會自動轉中文字
var data = JSON.parse(jsonResult);

參考資訊:

2013年5月9日 星期四

{C#} Excel.dll & NPOI 分析

Microsoft.Office.Interop.Excel;
 原理:開啟Server端Excel Application 讀取內容後關閉
 需求:Server端機器需加裝office Excel
 Code:
           Excel.Application xExcel = new Excel.Application();
            Excel.Workbook xbook = null;
            Excel.Worksheet xsheet = null;
            Excel.Range xRange = null;
            try
            {
               .......
            }
            finally
            {
                xbook.Close();
                xExcel.Quit();
                xbook = null;
                xsheet = null;
                xRange = null;
                xExcel = null;
                //確認已經沒有excel工作再回收
                GC.Collect();
            }

圖一、每New一次Excel.Application 使office Automation 啟動 即產生一個Process


嘗試以回收源方式關閉Process 無效;直接手動寫Code Kill Process 有一定的風險

                xbook.Close();
                xExcel.Quit();
                xbook = null;
                xsheet = null;
                xRange = null;
                xExcel = null;
                //確認已經沒有excel工作再回收
                GC.Collect();


嘗試引用已啟動的Excel.Application,在WinServer2008 R2 x64 OS下,出現Error Message
「HRESULT: 0x800401E3」
原因為Excel.Application被認定Running 無法被調用

 //檢查PC有無Excel在執行
            bool flag = false;
            foreach (var item in Process.GetProcesses())
            {
                if (item.ProcessName == "EXCEL")
                {
                    flag = true;
                    break;
                }
            }

            if (!flag)
            {
                xExcel = new Excel.Application();
            }
            else
            {
                ////延遲5秒載入
                //Thread.Sleep(5000);
                try
                {
                    //發生錯誤的地方
                    xExcel = (Excel.Application)Marshal.GetActiveObject("Excel.Application");//引用已在執行的Excel
                }
                catch (Exception)
                {
                }
             
            }

            if (xExcel != null) xExcel.Visible = true;//設false效能會比較好


NPOI
 原理:利用Java 函式庫POI轉包成.NET版本。POI直接深入到 OLE Compound Document 複合式  文件格式內存取資料,並物件導向化,外部開發人員利用POI 屬性去控制Office 檔案
 需求:NPOI 2.0 版本需引出多個Dll
 Code:
            Stream fileConent = File.Open(xlsPath, FileMode.Open);

////辯別是2007還是2003
            IWorkbook workbook = WorkbookFactory.Create(fileConent);

.....

//讀完一個Sheet關閉一個Sheet
                hs = null;

圖二、Excel物件的組成


NPOI目前每匯一張Excel僅透過Stream方式讀出資料,但讀取xlsx時,速度會因為xlsx架構是XmlSerializer  ,檔案越大,讀的速度越慢
http://npoi.codeplex.com/discussions/439282




OLE Compound Document 複合式文件:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms693383(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/dd942415.aspx

office運作與POI:
POI本身就是處理Office檔案的函式庫,Office都是微軟發展的OLE Compound Document 複合式文件,以結構化格式儲存在檔案中,由Excel物件模型去解析

參考來源:
http://www.dotblogs.com.tw/yc421206/archive/2012/03/09/70624.aspx

2013年5月6日 星期一

{C#} Microsoft.Office.Interop.Excel 引用 匯入Excel


Excel.Application:Excel應用程式
Excel.Workbook:應用程式裡的活頁簿,預設情況下,不管你開幾個Excel檔案,在工作管理員裡只會出現一個Excel.exe
Excel.Worksheet:活頁簿裡的工作表
Excel.Range:工作表裡的儲存格,一格也是Range,多格也是Range,用法Excel.Range[“A1”];
Excel.Range.Cells:這是儲存格的最小單位,代表一格的Range,用法Excel.Range.Cells[1,1];

//是否有Excel.exe 正在執行

void initailExcel()
        {
            //檢查PC有無Excel在執行
            bool flag = false;
            foreach (var item in Process.GetProcesses())
            {
                if (item.ProcessName == "EXCEL")
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                this._Excel = new Excel.Application();
            }
            else
            {
               //引用已在執行的Excel
                object obj = Marshal.GetActiveObject("Excel.Application");
                _Excel = obj as Excel.Application;
            }
            //設false效能會比較好
            this._Excel.Visible = true;
        }



開始讀Excel
  void openExcel(string filepath)
        {
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;
            Excel.Range range = null;
            DataTable arrdt = null;
            DataSet ds = new DataSet();
            string path = filepath;
            bool flag = false;
            try
            {
                book = _Excel.Workbooks.Open(path);//開啟舊檔案

                var sheetCount =book.Sheets.Count;
                //讀所有Sheet
                for(int i=1;i<=sheetCount;i++)
                {
                    arrdt = new DataTable();
                    sheet = (Excel.Worksheet)book.Sheets[i];
                    //sheet = (Excel.Worksheet)book.Sheets[1];//指定活頁簿,代表Sheet1
                    //sheet = (Excel.Worksheet)book.Sheets["Sheet1"];//也可以直接指定工作表名稱
                    Excel.Range xRange = sheet.UsedRange;
                   
                    //利用obj物件儲存值
                    object[,] valueArray = (object[,])xRange.get_Value(
                      Excel.XlRangeValueDataType.xlRangeValueDefault);

                    if (valueArray.Length > 0)  //陣列資料總個數大於零
                    {
                        int y = valueArray.GetLength(0);  //取得維度1的長度,即列數
                        int x = valueArray.GetLength(1);  //取得維度2的長度,即欄數
                        //建立欄名
                        for (int arri = 1; arri <= x; arri++)
                        {
                            if (valueArray.GetValue(1, arri) != null)
                                arrdt.Columns.Add(valueArray.GetValue(1, arri).ToString());
                            else
                                arrdt.Columns.Add("");

                        }

                        DataRow arrdr;
                        //建立資料
                        for (int arrj = 2; arrj <= y; arrj++)
                        {
                            flag = false;
                            arrdr = arrdt.NewRow();
                            for (int arrk = 1; arrk <= x; arrk++)
                            {
                                arrdr[arrk - 1] = (valueArray.GetValue(arrj, arrk) == null) ? "" : valueArray.GetValue(arrj, arrk).ToString();
                                if (arrdr[arrk - 1].ToString() != "")
                                    flag = true;
                            }
                            if(flag)
                                arrdt.Rows.Add(arrdr);
                        }
                    }
                    ds.Tables.Add(arrdt);
                }

                GridView1.DataSource = ds.Tables[0];
                GridView1.DataBind();
                GridView2.DataSource = ds.Tables[1];
                GridView2.DataBind();
            }
            finally
            {
                book.Close();
                book = null;
            }
        }


來源:
http://www.dotblogs.com.tw/yc421206/archive/2012/03/09/70624.aspx

2013年4月30日 星期二

{C#} To List 轉Json 方式

方法一:
.Net 內 建

using System.Web.Script.Serialization;

var modelList = abc.ToArray();
var stringTemp = new JavaScriptSerializer().Serialize(modelList);


方法二:
另外載入DLL
using Newtonsoft.Json;
var modelList = abc.ToArray();
var turnToJson = JsonConvert.SerializeObject(modelList , Formatting.Indented);

2013年4月19日 星期五

{C#} const & static 差異

Const 與 Static都屬不可被變動的變數設定
Const 存放的變數是非動態值
Static 則存放動態值

Example:

    public const int c2 = c1 + 1;     public static int s1 = 6;         c1 = s1;  //錯誤         s1 = c2+1;         Label2.Text = "const:" + c1 + " const2:" + c2 + " static:" + s1; OutPut:

const:5 const2:6 static:7

參考資訊:
http://www.dotblogs.com.tw/kim/archive/2009/05/11/const.aspx

2013年4月17日 星期三

{C#} .Net FileUpload 上傳檔案大小超過預設


當上傳檔案後,出現「Maximum Request Length Exceeded」
是因為上傳的檔案超過預設大小
預設為4096>>4MB  

異動如下:
<system.web>
      <httpRuntime maxRequestLength="10240"  />
    </system.web>



參考資訊
http://www.dotblogs.com.tw/hatelove/archive/2010/01/14/fileuploadmaxrequestlengthtocustomerrorpage.aspx

2013年4月1日 星期一

{Other} 架設網站

1.DropBox 加大空間方法>
http://gcchiou.pixnet.net/blog/post/27309588-%E3%80%90%E8%BD%89%E8%BC%89%E3%80%91%E9%9D%A0%E8%87%AA%E5%B7%B1%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%BE%97%E5%88%B0%E5%85%8D%E8%B2%BB18g%E7%9A%84dropbox%E7%A9%BA



太重要的文章:如何把Drop box當 js 存放地給引用
http://www.study-test.com/2012/09/10/388/



2.SOMEE 國外伺服器,中文網頁(aspx)會有問題
https://somee.com/default.aspx

2013年2月27日 星期三

{JQuery}倒數計時器(Like hTC時鐘效果)

當到數十秒結束後,將saveBtn 效果Open

JavaScript:
function timerStart() {
            $("span").each(function () {
                $(this).attr('style', 'display');
            });
            //只有秒數
            $('.counter').counter({ format: '59' });
            //事件:counterStop
            $('.counter').live('counterStop', function () {
                $('#<%=saveBtn.ClientID %>').removeAttr('disabled');
            });
         }


Html:
<asp:Button ID="saveBtn" runat="server" Text="Upload" class="btnred" />

<span id="spanCounterWord" style="display:none" >等待</span>
                <span class="counter  counter-analog" id="spanCounter" style="display:none" >0:10</span>
                <span id="spanCounterWord2" style="display:none" >秒後,即可再度上傳</span>


註1:在API中綁定counterStop事件用 on , 其為jQuery UI版本為1.7以上才能使用,
        1.7以下的版本使用 live 綁定
註2:each 使用如下Sample:

$("span").each(function () {
});


$("span[dir='value']").each(function(){
});


API:
http://blog.sophilabs.com/2012/08/jquery-counter-plugin/

JS 綁定事件
http://blog.wu-boy.com/2012/04/use-on-api-to-attach-event-handlers-on-jquery/

each 瀏覽標籤
http://stackoverflow.com/questions/1936411/return-the-text-of-each-span-using-jquery
API:
http://api.jquery.com/each/
參考資料:
http://stackoverflow.com/questions/1936411/return-the-text-of-each-span-using-jquery

2013年1月23日 星期三

{JQuery} 函式 運用 (更新時間:04/09)

1.函式:$.map(source,function (item)
解釋:列出陣列中資料(JSON. ARRAY)
範例:

$.map(JSON.parse($("#<%=Source.ClientID %>").val()),function (item) {
    $('#<%=ddlAAA.ClientID%>').append($('<option value=' + item+ '>' + item  + '</option>'));
                            })

參考資料:http://api.jquery.com/jQuery.map/



2.函式:$.grep(source, function (item)
解釋:比對外來資料與陣列中的資料(JSON. ARRAY)
範例:

$.map(source,function (item) {

  $.grep(JSON.parse($("#<%=Source.ClientID %>").val()), function (item) {
                        return (new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i")).test(item);
                    })


參考資料:http://api.jquery.com/jQuery.grep/

2013年1月3日 星期四

{JavaScript} html控制項利用JS Bind事件


$('#btnAdd').bind('click', function () {
                        var qty = $('#txtQty').val() != '' ? parseInt($('#txtQty').val()) : 0;
                        var sum = $('#hiddenText').val() != '' ? parseInt($('#hiddenText').val()) : 0;
                        var total = qty + sum;
                        $('#hiddenText').val(total);
                        alert($('#hiddenText').val());
                    })

<input type="button" id="btnAdd" value="加入" />

按鈕btnAdd利用JS語法,Bind 住 Click事件

參考資料:
http://stackoverflow.com/questions/6458840/on-input-change-event