有時在作字串截取處理時,常常遇到字串中有中文、英文或特殊符號,利用substring or mid 函數,無法截取的很準確(因為兩者都是以Length來計算長度而不是用位元組數)。
索性動手寫了一支小程式解決這個問題 。程式碼如下:
有時在作字串截取處理時,常常遇到字串中有中文、英文或特殊符號,利用substring or mid 函數,無法截取的很準確(因為兩者都是以Length來計算長度而不是用位元組數)。
索性動手寫了一支小程式解決這個問題 。程式碼如下:
因工作需要,想在網站上做到讓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的程式,並傳回客戶端。
有時候,我們會以下拉式選單呈現的方式讓User選擇想要的功能,再執行該功能。例如以下拉式選單增加兩個項目,匯出DOC及匯出PDF,並建立兩Class:CExportDOC、CExportPDF。分別在Class中建構匯出文件的程式碼,然後在aspx檔的Code Behind中寫個switch條件式,去產生新的執行個體執行方法。Ex:
CExportDOC doc = new CExportDOC();
有時候在前端頁面中想要到資料庫中查詢少許的資料,憑此資料寫相對應的判斷式。如果以postback方式回後端,會將整個頁面的資料(含ViewState、ControlState)一併傳回後端,再次歷經Page的生命週期,對系統來說,無一不是種負擔。即使是以UpdatePanel方式回後端,也同樣會巡覽Page一次,與PostBack不同之處,只是使用UpdatePanel的方式會將部分資料重新Render後回傳回前端(有包UpdatePanel的區塊)。其實,可以利用ScriptManager的PageMethods來實現ajax。網路上已有許多教學文章可供參考學習。如以下連結:
在ASP.NET網站中經常使用主版頁面(MasterPage)來製作相同的配置樣式以統一所有頁面的外觀,今作了一個小實驗,以釐清觀念,在套用了主版頁面後,網頁的生命週期是如何進行的。
Step 1:在MasterPage中的後置程式碼中,依序建立PreInit、Init、InitComplete、PreLoad、Load、LoadComplete、PreRender、Render....的事件區塊,再Response.Write() 輸出識別用的字串,如以下code:
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;
}
}
最近寫了一支定時執行工作的程式,想在工作結束時將寫入情況、耗費時間寫入到Log檔。無意中發現微軟已經把寫入到Log檔的功能已經包好了,真是佛心來的。
只要透過My.Application.Log.WriteEntry這支function就能寫入到Log檔。而預設的Log檔是存放在一個隱藏的資料夾中:
情境模擬如示意圖 : 點擊GridView上的TextBox後,要帶出ModalPopupExtender,勾選ModalPopupExtender上的選項後再將值寫回Textbox上。
微軟的ajax tool kit有個CalendarExtender控制項可以很方便的產生萬年曆供user選取日期,
也能在後置程式碼中取得選取值。但如果想在前端js中取到選許的日期,就沒那麼容易了。經過努力爬文後,
以往在前端網頁中,利用javascript產生的資料想送回後端,交由後端程式處理時,會利用一個隱藏欄位+一個隱藏按鈕(display:'none'),將資料寫入到隱藏欄位中後,再利用javascript去觸發隱藏按鈕,去執行button_click中的程式,如以下寫法:
<script src="jquery-1.4.4.js" type="text/javascript"></script>
長久以來,我的Visual Studio 2008經常跳出無法啟動程式的錯誤,按了確定後,沒執行偵錯又回到vs2008裡了,爬文許久,終於找到解決方法了 :
1) Open RegEdit
延續 以jQuey DOMWindow plugin實現子頁面資料回傳父頁面心得筆記 一文,如果利用AjaxToolKit中的ModalPopupExtender要實現同樣的功能,實作起來更為簡單。
1.在Visual Studio中布置以下的控制項: