目前分類:.NET (14)

瀏覽方式: 標題列表 簡短摘要

有時在作字串截取處理時,常常遇到字串中有中文、英文或特殊符號,利用substring or mid 函數,無法截取的很準確(因為兩者都是以Length來計算長度而不是用位元組數)。

索性動手寫了一支小程式解決這個問題 。程式碼如下:

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

因工作需要,想在網站上做到讓User在客戶端自由點選pdf檔,選完後一次打包下載。本想利用jQuery ajax將客戶選定的資料送回後端處理後,再Response.BinaryWrite出來。怎知jQuery報錯。原來要進行檔案下載,是不能以ajax方式,而必須讓網頁postback回後端,經後端處理後Response.BinaryWrite出來。但畫面User選定的值會被洗掉,且不想讓畫面"閃"一下。參考了網路上前輩們的作法,決定利用iframe這個html tag來實作。

思路:當user點選button後,會call 一支javascript function,該function會在html body中append一個iframe,並指定iframe的src(../download.aspx)。此時iframe會根據指定的src載入download.aspx。而在download.aspx的code-behind Page_Load中,撰寫將多個pdf檔壓縮成zip的程式,並傳回客戶端。

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

閒來無事在點部落上壓馬路,無意中發現了SignalR這個強大的套件,它把Real-Time功能封裝,且功能強大。有了它,可以很輕易的實現及時訊息的傳遞(ex:Chat、ProgressBar)。

根據原開發者的設定,SignalR提供了兩種訊息傳遞的開發方式,一種為Hub,另一種為PersistentConnection。兩者比較在朱大的文章中有較詳細的說明,我試玩之後,覺得Hub實作起來較簡單;而PersistentConnection較為彈性。

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

有時候,我們會以下拉式選單呈現的方式讓User選擇想要的功能,再執行該功能。例如以下拉式選單增加兩個項目,匯出DOC及匯出PDF,並建立兩Class:CExportDOCCExportPDF。分別在Class中建構匯出文件的程式碼,然後在aspx檔的Code Behind中寫個switch條件式,去產生新的執行個體執行方法。Ex:

    CExportDOC doc = new CExportDOC();

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

有時候在前端頁面中想要到資料庫中查詢少許的資料,憑此資料寫相對應的判斷式。如果以postback方式回後端,會將整個頁面的資料(含ViewState、ControlState)一併傳回後端,再次歷經Page的生命週期,對系統來說,無一不是種負擔。即使是以UpdatePanel方式回後端,也同樣會巡覽Page一次,與PostBack不同之處,只是使用UpdatePanel的方式會將部分資料重新Render後回傳回前端(有包UpdatePanel的區塊)。其實,可以利用ScriptManager的PageMethods來實現ajax。網路上已有許多教學文章可供參考學習。如以下連結:

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

在ASP.NET網站中經常使用主版頁面(MasterPage)來製作相同的配置樣式以統一所有頁面的外觀,今作了一個小實驗,以釐清觀念,在套用了主版頁面後,網頁的生命週期是如何進行的。

Step 1:在MasterPage中的後置程式碼中,依序建立PreInit、Init、InitComplete、PreLoad、Load、LoadComplete、PreRender、Render....的事件區塊,再Response.Write() 輸出識別用的字串,如以下code:

忙裡偷閒 發表在 痞客邦 留言(1) 人氣()

NPOI是在.NET上實現DataTable、Excel互轉的利器,工作上我習慣用該組件來實現所需的功能。具體做法可以參考MSDN CodePlex上的說明。我根據gipi大所提供的換行作法,修改了CodePlex上匯出excel部分的程式碼,如下所示 :

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.POIFS;
using NPOI.Util;
 
public class DataTableRenderToExcel
{
    public static Stream RenderDataTableToExcel(DataTable SourceTable)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        MemoryStream ms = new MemoryStream();
        HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
        HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
 
        // handling header.
        foreach (DataColumn column in SourceTable.Columns)
            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
        // handling value.
        int rowIndex = 1;
 
        foreach (DataRow row in SourceTable.Rows)
        {
            HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
 
            foreach (DataColumn column in SourceTable.Columns)
            {
                HSSFCellStyle cs = (HSSFCellStyle)workbook.CreateCellStyle();
                cs.WrapText = true; // 設定換行
                cs.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.TOP; //文字對齊方式
                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                char[] ch = new char[]{'\n'};
                string[] str = row[column].ToString().Split(ch); 
                if (row[column].ToString().Contains("\n"))
                {
                    dataRow.Cells[column.Ordinal].CellStyle = cs;
                    dataRow.HeightInPoints = str.Length * sheet.DefaultRowHeight / 20;//計算Cell的高度
                }
            }
            rowIndex++;
        }
        workbook.Write(ms);
        ms.Flush();
        ms.Position = 0;
        sheet = null;
        headerRow = null;
        workbook = null;
        return ms;
    }
    public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
    {
        MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
        FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
        byte[] data = ms.ToArray();
        fs.Write(data, 0, data.Length);
        fs.Flush();
        fs.Close();
        data = null;
        ms = null;
        fs = null;
    }
}

文章標籤

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

最近寫了一支定時執行工作的程式,想在工作結束時將寫入情況、耗費時間寫入到Log檔。無意中發現微軟已經把寫入到Log檔的功能已經包好了,真是佛心來的。

只要透過My.Application.Log.WriteEntry這支function就能寫入到Log檔。而預設的Log檔是存放在一個隱藏的資料夾中:

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

情境模擬如示意圖 : 點擊GridView上的TextBox後,要帶出ModalPopupExtender,勾選ModalPopupExtender上的選項後再將值寫回Textbox上。

2011-7-5 20-50-27.png    

文章標籤

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

微軟的ajax tool kit有個CalendarExtender控制項可以很方便的產生萬年曆供user選取日期,
也能在後置程式碼中取得選取值。但如果想在前端js中取到選許的日期,就沒那麼容易了。經過努力爬文後,

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

以往在前端網頁中,利用javascript產生的資料想送回後端,交由後端程式處理時,會利用一個隱藏欄位+一個隱藏按鈕(display:'none'),將資料寫入到隱藏欄位中後,再利用javascript去觸發隱藏按鈕,去執行button_click中的程式,如以下寫法:

<script src="jquery-1.4.4.js" type="text/javascript"></script>

文章標籤

忙裡偷閒 發表在 痞客邦 留言(1) 人氣()

長久以來,我的Visual Studio 2008經常跳出無法啟動程式的錯誤,按了確定後,沒執行偵錯又回到vs2008裡了,爬文許久,終於找到解決方法了 :

1)  Open RegEdit

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

1.png  
如上圖所示,想要在Page_Load時,動態產生CheckBox,以及其對應的事件,參考微軟的MSDN後,自己實作了一下,蠻簡單的,看倌們可以參考看看。

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()

延續 以jQuey DOMWindow plugin實現子頁面資料回傳父頁面心得筆記 一文,如果利用AjaxToolKit中的ModalPopupExtender要實現同樣的功能,實作起來更為簡單。
1.在Visual Studio中布置以下的控制項:

忙裡偷閒 發表在 痞客邦 留言(0) 人氣()