第一步當然是把編譯less的環境給建構出來,在此做個筆記,以免日後又忘了如何安裝~"~
1.下載並安裝Cygwin 。Cygwin簡單的說就是可以在windows下模擬操作unix系統。安裝Cygwin的同時,會一併將node.js安裝進去。由於我們需要靠npm(Node Package Manager)這個node.js的套件管理工具來安裝lessc,所以所以node.js是必要安裝項目。
2.開啟Cygwin命令視窗,輸入npm install -g less,就會開始安裝lessc:
]]>
然而我有時總是得嘗試很多次才寫出想要的結果(唉,怪自己LINQ底子太差了),
所以想找一套工具能幫我SQL TO LINQ,藉此快速學習。
於是找到這套Linqer。
一、執行Linqer.exe後,得預先設定初始值。
]]>假設前端有10個ajax,今已非同步方式,依照前端ajax的順序跟後端要資料,這可考倒我了。玩過ajax非同步都知道,它回來的順序是無法控制的。例如以下demo:
<scripttype="text/javascript">
$(document).ready(function () {
q1();
]]>索性動手寫了一支小程式解決這個問題 。程式碼如下:
''' <summary>
''' 截取index為0到某Length的字串
''' </summary>
]]>我先以bootstrap拉了一個主版面出來,如下圖所示:
View的區塊就是讓template透過Route指引Multi Views來自動變化。而我想在一開始時先表列資料,點選某筆資料後,畫面切換到資料的明細,亦即List-Detail的呈現方式。
List畫面 :
]]>供不同的controller使用,已達到reuse的目的。而我們能把提取後端資料的部分做成一service,如以下筆記:
services.js :
angular.module('myApp', ['ngResource']). //將ngResource module加入自訂的application
factory('myService', function ($resource) { //create service
]]>不過這次是AngularJS的bug,不是我的問題
原程式如下,簡單來說,就是透過controller到後端撈資料,再將資料放入moudle透過ng-repeat指令輪詢 li tag展示出來。
看似沒問題的一段code,是的!我也沒寫錯,但回傳的資料格式永遠是xml,而不是我定義的json。
但明明我有為headers屬性,指定一個'Content-Type':'application/json'的物件了,難不成XMLHttpRequest物件並沒有把這個header給傳給後端嗎?
]]>
在Firefox、Chrome底下都沒問題,但用IETESTER測試IE各個版本時,發現在IE8以下版本,AngularJS失去作用了,整個Template露出來給你看 冏
於是詢問孤狗大神 + 實際測試後,找到了解決方法,趕快作筆記起來 XD
粗體字為解決方法:
1、將ng-app指令拿掉,以id="ng-app" class="ng-app"取而代之。
]]>思路:當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的程式,並傳回客戶端。
經過孤狗大神的指示,找到了DotNetZip這個好用的壓縮/解壓縮元件。
Default.aspx:
]]>根據原開發者的設定,SignalR提供了兩種訊息傳遞的開發方式,一種為Hub,另一種為PersistentConnection。兩者比較在朱大的文章中有較詳細的說明,我試玩之後,覺得Hub實作起來較簡單;而PersistentConnection較為彈性。
首先透過擴充管理員以NuGet將SignalR的套件自動安裝到專案或網站上。
一、以Hub實作:
先來建立後端物件
]]><!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
]]>今天在玩佔位文字時,突發奇想,要如何改變placeholder的文字顏色或者背景顏色呢? 上網爬文了一下,能用CSS解決。
如果你看不到以下的textbox內的佔位文字(Please input texts),表示瀏覽器不支援,目前IE9以下的版本都不支援。
加入以下的CSS Style可改變佔位文字顏色及背景顏色:
]]>主要是想測試一下在Dart中,addEventListener及setInterval這兩個函數的寫法。
TestBallMove.html :
<html>
<head>
class Customer{
String _name ;
String get name() => "HELLO "+ _name ; //getter
set name(String value) => _name = value ; //setter
]]>而要在各家瀏覽器中裝載Dart的VM,除了Google自家的Chrome,Google承諾會裝載VM外,微軟首先持反對票,也許是商業利益上的考量吧,姑且不論這些瀏覽器廠商間的角力賽,Dart為程式設計師帶來的是更具可讀性、複用性更高的coding方式,一改javascript長久以來的許多詬病。看來前端網頁設計師也得學物件導向了XD。
初試了Dart,語法跟C#、Java很像,令我驚訝的是,Dart也容許類似lamdba的寫法,ex:(a,b) => a + b。
或許你已經躍躍欲試了吧,你可以在Dart的官網上下載到免費的DartEditor,或是在Dart線上編譯器上小試身手。當你下載下來後,直接執行目錄內的DartEditor.exe就能運行了,提醒您一下,千萬別跟eclipse的目錄放在同一層,不然在complier時會有Exception跑出來,這個Exception害我浪費不少時間Orz,最後在官網上找到以下這段提示才解決:
Important: Do not use the Dart installation directory for any other Eclipse-based software. If Dart Editor and Eclipse share the same workspace
directory, they'll save conflicting settings, resulting in warnings and errors from both Dart Editor and Eclipse.
<!DOCTYPE html>
<html>
<head><title>Web SQL Database Test</title>
<script>
function pageLoad() {
//1024 * 1024 = 1 MB
//採用SQLite Script,Create Table :http://www.sqlite.org/lang_createtable.html
//W3C文件:http://www.w3.org/TR/webdatabase/#dom-sqltransaction-executesql
var SQLScript = 'create table if not exists tCustomer(id integer primary key autoincrement ,name varchar(10) default "")';
var db = openDatabase('dbBOM', '1.0', 'test database', 1024 * 1024);
document.getElementById('create').addEventListener('click', function () {
db.transaction(function (t) {
t.executeSql(SQLScript);
}, function (e) {
alert(e.message);
});
}, false);
document.getElementById('set').addEventListener('click', function () {
db.transaction(function (t) {
t.executeSql("insert into tCustomer(name) values('andy')");
t.executeSql("insert into tCustomer(name) values('bill')");
}, function (e) {
alert(e.message);
});
}, false);
document.getElementById('drop').addEventListener('click', function () {
db.transaction(function (t) {
t.executeSql("drop table tCustomer");
}, function (e) {
alert(e.message);
});
}, false);
document.getElementById('get').addEventListener('click', onGetData, false);
function onGetData() {
db.readTransaction(function (t) {
t.executeSql('select * from tCustomer', [], SetData);
});
}
function SetData(t, r) {
for (var i = 0; i < r.rows.length; i++) {
for (var o in r.rows.item(i)) {
alert(r.rows.item(i)[o]);
}
}
}
}
</script>
</head>
<body onload="pageLoad();">
<input value="建立資料表" id="create" type="button"><br>
<input value="刪除資料表" id="drop" type="button"><br>
<input value="插入資料" id="set" type="button"><br>
<input value="取得資料" id="get" type="button"><br>
</body>
</html>
2.在Chrome中,localstorage的資料是以SQLite資料庫的格式存放。路徑(win 7)為C:\Users\用戶名\AppData\Local\Google\Chrome\User Data\Default\Local Storage。下載位址:http://www.sqlite.org/download.html,下載後點選localstorage的檔案按右鍵->開啟->從已安裝程式的清單選取程式 選擇以sqlite3開啟,如圖所示:
開啟後以DOS COMMAND輸入SQL查詢子句,即可獲得存在Chrome localstorage的key/value,如圖所示:
]]>
CExportDOC doc = new CExportDOC();
doc.ExecExport();
如此作法,當以後還要再加個新功能時,除了下拉式選單要修改,再增加一個item,Code Behind的switch也要多一條條件式,另外再增加一個Class撰寫功能。要改三個地方實在麻煩。
透過.NET的Reflection反射機制,我們可以動態的產生下拉式選單,而Code Behind也不用再以switch寫,我們要作的,只是專注在功能上的開發。以下為實作的範例 :
Step 1:在MasterPage中的後置程式碼中,依序建立PreInit、Init、InitComplete、PreLoad、Load、LoadComplete、PreRender、Render....的事件區塊,再Response.Write() 輸出識別用的字串,如以下code:
protected void Page_PreInit(object sender, EventArgs e) { Response.Write("1 Master Page_PreInit" + "<br/>"); } protected void Page_Init(object sender, EventArgs e) { Response.Write("2 Master Page_Init" + "<br/>"); } protected void Page_InitComplete(object sender, EventArgs e) { Response.Write("3 Master Page_InitComplete" + "<br/>"); } protected void Page_PreLoad(object sender, EventArgs e) { Response.Write("4 Master Page_PreLoad" + "<br/>"); } protected void Page_Load(object sender, EventArgs e) { Response.Write("5 Master Page_Load" + "<br/>"); } protected void Page_LoadComplete(object sender, EventArgs e) { Response.Write("6 Master Page_LoadComplete" + "<br/>"); } protected void Page_PreRender(object sender, EventArgs e) { Response.Write("7 Master Page_PreRender" + "<br/>"); } protected void Page_PreRenderComplete(object sender, EventArgs e) { Response.Write("8 Master Page_PreRenderComplete" + "<br/>"); } protected void Page_SaveStateComplete(object sender, EventArgs e) { Response.Write("9 Master Page_SaveStateComplete" + "<br/>"); } protected void Page_Render(object sender, EventArgs e) { Response.Write("10 Master Page_Render" + "<br/>"); } protected void Page_Unload(object sender, EventArgs e) { //Response.Write("Page_Unload" + "<br/>"); }
Step 2:在Default.aspx中的後置程式碼中,以如同Step 1的作法,建立出事件區塊,輸出識別用的字串
執行Default.aspx後結果如下 :
1 Sub Page_PreInit
2 Master Page_Init
2 Sub Page_Init
]]>
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;
}
}
select b.* from sys.objects a inner join sys.columns b
on a.object_id= b.object_id where a.name='tabe_name'
select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
]]>只要透過My.Application.Log.WriteEntry這支function就能寫入到Log檔。而預設的Log檔是存放在一個隱藏的資料夾中:
C:\Documents and Settings\登入的使用者名稱\Application Data\專案名稱\1.0.0.0 'Application Data為隱藏的資料夾
我們也能在程式裡去指定存放的路徑。完整程式碼如下 :
看似簡單的問題,卻也讓我折騰了好幾小時。所幸經過一番努力,終於TRY出來了。
解法如下 :
一、在Textbox旁邊,設置了一顆隱藏按鈕(display:none),給它個CommandName,CommandArgument抓的是GridView的row index,等等要在RowCommand Event裡要用到。若ModalPopupExtender出來的畫面是包在UpdatePanel中,在ModalPopupExtender的屬性裡,OkControlID、CancelControlID這兩個屬性不能設,好讓確定按鈕或取消按鈕以ajax的方式傳回。
]]>
以下範例是一textbox中有預設Date Now的值,另一textbox透過CalendarExtender選取日期,所選取的日期不可小於預設日期,否則便清空欄位
]]><script src="jquery-1.4.4.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#Button1').click(function() {
]]>
<STYLE>
.evenColor{ background-color:#999966; }
.oddColor { background-color:#E8E8E8; }
</STYLE>
1) Open RegEdit
2) Browse to HKEY_LOCALMACHINE -> SOFTWARE -> Microsoft -> Internet Explorer -> Main
3) Add a dword under this key called TabProcGrowth
4) Set TabProcGrowth to 0
]]>
如這樣:
<script src="jquery-1.6.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
]]>using System;
using System.Collections.Generic;
using System.Linq;
]]>
2.GridView1中的OrderID欄位改為LinkButton
]]>
折騰了幾天的時間,終於作出來了,分享給看倌們。
一、建立parent.aspx、child.aspx兩個頁面
]]>
編號 | 姓名 | 全選□ |
A001 | ANDY | □ |
A002 | LAU | □ |
1. 對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2. 應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置預設值0,確保表中num列沒有null值,然後這樣查詢:
]]>
如果想要抓取table中第11~20筆的資料,靠fUserId是沒辦法的(跳號了),
而MS SQL又沒提供像FoxPro的recno() 這種抓取記錄筆數的function,這時得靠通用資料表運算式 (CTE)了,
用法如下:
以下是plugin的樣板:
jQuery.fn.mytoolbox = function() {
return this.each(function() {
回到最近的一個"破壞性"操作之前。即,將匹配的元素列表變為前一次的狀態。
如果之前沒有破壞性操作,則返回一個空集。所謂的"破壞性"就是指任何改變所匹配的jQuery元素的操作。這包括在 Traversing 中任何返回一個jQuery物件的函數--'add', 'andSelf', 'children', 'filter', 'find', 'map', 'next', 'nextAll', 'not', 'parent', 'parents', 'prev', 'prevAll', 'siblings' and 'slice'--再加上 Manipulation 中的 'clone'。
索性自己寫段程式try了一下,就懂它的意思了。直接看範例最容易懂,您可以把以下的code貼到w3cschools的線上測試。
以下的code中,用next()去取得div2的object並修改了css的樣式,然後用end()去取得一個JQuery object放入變數v中,再show出這個object的text()。
]]>