2008年9月30日 星期二

清除資料庫 log

清除資料庫 log 的指令:

[dbname]:表示資料庫名稱

dump tran [dbname] with no_log

2008年9月3日 星期三

寬度設為零,firefox 瀏覽器卻還會顯示出來

在 firefox 或 Chrome 瀏覽器,如果將一個 Button 的 width 設為 0 (ex: width:0px),在IE 會正常的看不到東西,可是在 firefox 或 Chrome 卻老是多留了一些尾巴出來。這問題主要是因為 border-width 與 width 在 IE 與 firefox 或 Chrome 的解讀不同。一般說來,只要設定 width=0 ,IE 就會看不到任何東西了。但對 firefox 或 Chrome而言,卻有著兩個重要設定影響著畫面呈現:width 與 border-width。

在 firefox 或 Chrome 中,如果你設定 width=0,實際上還是有長度的。因為他預設是有填塞空白的,這裡不能將這填塞空白與 border-width 畫上等號,反到要視為 padding的概念。所以,如果你是希望呈現 width=0 的效果,除了設定width外,還要加上 padding:0 。

另一個容易忽略的地方,則是 border-width。因為 firefox 或 Chrome 對於 border-width 都有預設值,而且是 2 不是 0 ,若是忽略不去設定,則外框還是會跑出來的。

範例:

<input id="btnNone" style="width: 0px; padding:0;border-width:0px" onclick="return

false;" type="submit" value="btnNone" />


關鍵字:隱藏、hidden、visible

2008年8月20日 星期三

SQL 中文排序結果

在 SQL 查詢結果做排序時,如果排序欄位的內容為中文字,運氣不好時會發現,不見得是根據筆畫比較少的來排。這問題,極可能是跟 DB 的定序預設值有關,也就是說,他的排序方式並非我們所認為的筆劃排序。這時,可以透過轉換定序的方式來解決。

convert(nvarchar(max), code_valuedesc) COLLATE Chinese_Taiwan_Stroke_CS_AS tech_domain_name

利用 convert 搭配指定定序 即可完成。

2008年7月28日 星期一

如何輸入多筆後再一起記錄到DataBase

拜讀 AllenKuo所精心製作的教學介紹,實在不忍直接偷貼過來,還請看官移駕到原網站欣賞。他在介紹影片中所使用的是 .Net 1.1 GrideView + CollectionBase 來解,但在後面的留言中提到,.Net 2.0 可以利用泛型的類別來完成他。所以自己也笨笨的練習了一下,並將幾個在實作中出槌的小地方註解了一下。

AllenKuo 教學網址

個人心得筆記網址

泛型排序需求

關鍵字:
序列化,RowDeleting,泛型 List<t> ,排序


2008年7月23日 星期三

Professional ASP.NET 2.0 AJAX


程式碼下載網址:[Wrox]
勘誤表:[Wrox]
作者 Dan Wahlin 的 部落格一 、部落格二


這本書在Chapter 4 的範例有許多不正確的地方,可以參考作者程式碼中的範例。

延伸閱讀:
01. 在 Dan 的部落格提到 Silverlight 2.0 蠻不錯的介紹。[網址]
02. 免費的 ASP.Net 2.0 介紹。[網址]
03. Silverlight 2.0 安裝注意事項。[網址]
04. 其他相關 Silverlight 功能介紹。[網址]

處理在 GridView 自定控制項觸發事件無法執行的問題

在GridView裡,常常會透過 ItemTemplate 放一些我們所需要的控制項。舉 DropDownList 為例,我們可能會在這個 DropDownList 裡放兩個值,A 與 B 。假設每次的選擇都會需要觸發 PostBack 以利我們做後續動作,所以除了將這個 DropDownList 的 AutoPostBack 設為 True 之外,還會在 .cs 程式裡寫 :



protected override void OnPreRender(EventArgs e)

{
if (!IsPostBack)
{
gv_coorgcd.DataSource = (DataTable)ViewState["tmpTable"];
gv_coorgcd.DataBind();
}
base.OnPreRender(e);
}

protected void gv_coorgcd_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Control ctl=null;
ctl = e.Row.FindControl("ddl_orgtype");
if (ctl != null)
{
DropDownList ddl_orgtype = (DropDownList)ctl;
ddl_orgtype.SelectedIndexChanged += new
EventHandler(ddl_orgtype_SelectedIndexChanged);
}
}
}

protected void ddl_orgtype_SelectedIndexChanged(object sender, EventArgs e)
{
int rowindex = ((GridViewRow) (((DropDownList) sender ).NamingContainer )).RowIndex;
}

這程式裡隱含了很大的問題,但不容易被發現。從 覆載 OnPreRender( ) 來看,只有在第一次進入這個頁面時,才會去執行 gv (GrideView) 的資料繫結,並執行到 gv_coorgcd_RowDataBound(),也因此為 ddl_orgtype 註冊了 SelectedIndexChanged 事件。

然而,當 USER 觸發下拉清單 ddl_orgtype 觸發了 PostBack 後,這次並不會再執行 gv_coorgcd.DataBind(),也不會註冊 SelectedIndexChanged 事件,所以你會發現,ddl_orgtype_SelectedIndexChanged 根本就不再有機會被呼叫。

要解決這問題,目前有兩個方法,分別介紹一下:

方法一:
比較簡單直接。就是將註冊 ddl_orgtype 的 SelectedIndexChanged 事件,改由 .aspx 去寫,而不是原先的 .cs 。 所以,我們可以在 aspx 中寫入以下的程式:

<asp:GridView ID="gv_coorgcd" runat="server" AutoGenerateColumns="False"
OnRowDataBound="gv_coorgcd_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="ddl_orgtype" runat="server" AutoPostBack="true"
OnTextChanged="ddl_orgtype_SelectedIndexChanged" >
<asp:ListItem Text="院內" Value="1" Selected="true"></asp:ListItem>
<asp:ListItem Text="院外" Value="2" ></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

注意囉!就是 OnTextChanged="ddl_orgtype_SelectedIndexChanged" 。我們直接將這事件註冊在這個物件的預設宣告裡,就不用在 .cs 透過程式動態去新增了。

方法二:
雖然在第二次進入頁面時(IsPostBack)沒有再重新繫結 gv_coorgcd,但卻可以知道這次的 PostBack 是由誰所觸發。我們可以據此來決定後面所要執行的動作。

所以,可以在 OnPreRender( ) 事件加上下面的程式:
protected override void OnPreRender(EventArgs e)
{
if (!IsPostBack)
{
gv_coorgcd.DataSource = (DataTable)ViewState["tmpTable"];
gv_coorgcd.DataBind();
}
else
{
string post_target = Request.Form["__EVENTTARGET"];
if (post_target != null)
{
if (post_target.Contains("ddl_orgtype"))
{
//Do something about ddl_orgtype SelectedIndexChanged
}
}
}
base.OnPreRender(e);
}

透過 Request.Form["__EVENTTARGET"] 就可以取得觸發 PostBack 的始作俑者了。

當然,個人是偏好第一種方法,簡單實用又大方。

2008年7月16日 星期三

最後的演講

摘要:
  • 別忘了準備對別人有利的方案,這樣別人才會更願意跟你打交道。
  • 只要把聰明的人講過的話自己拿來講一遍,就能夠讓自己看起來也很聰明。
  • 專注於當下,不去想未來那些負面的事情。我們如果每天都把時間花在為明天提心吊膽,這樣是沒有幫助的。
  • 有太多人都經常抱怨自己人生中的各種問題。我向來認為,你如果願意把抱怨的力氣拿出十分之一用在解決問題上,一定不免大吃一驚,發現事情原來沒有你想像的那麼糟。
  • 你如果沒有得到你想要的東西,至少得到了經驗。失敗不但是可以接授的,而且經常還是人生不可或缺的要素。
  • 你如果比別人花更多時間工作,那麼你在多做的這些時間裡就會對自己的工作更加精通。這樣一來,你就可能變得更有效率、更有能力,甚至更快樂。付出努力就像是銀行的複利,你獲得的獎賞會累積得很快。
  • 想要什麼東西,開口問就是了。不用怕,獲得肯定答案的機會,一定比你想像的還要頻繁。
  • 布魯克斯定律:一項軟體專案的時程如果已經落後,增加人力只會造成落後程度更嚴重。