2008年12月18日 星期四

TreeView控制項 CheckBox控制

這篇主要是整理我目前找到對於
TreeView CheckBox勾選時附節點與子節點所應該作的連動 javascript程式

首先要先看一下TreeView在瀏覽器所顯示出來的原始碼 這樣會比較好理解javascript在寫什麼



















會發現他是用div以及table所組成
(節點是包在table裡面,如果有子節點的話就會跟著div將子節點包起來)

大概了解一下TreeView的樣子後就可以來看一下在asp.net forums上找到的javascript,加上我自己的註解(因為我對javascript不熟,所以註解也許寫的很白痴,請見諒..=.=)
(來源網址:http://forums.asp.net/p/976122/1733193.aspx#1733193)


ReportViewer 除數為零 #Error 處理

在使用ReportViewer時
如果有欄位是用到"除式" (=Fields!P.Value / Fields!C.Value)
並且分母不幸是0時 (Fields!C.Value=0)
會發現此欄位會顯示#Error(中文的話是#錯誤)
以為用IIF判斷就可以避開
=IIf(Fields!C.Value = 0, "N/A", Fields!P.Value / Fields!C.Value)
結果沒有想到一樣還是Error

找了一下微軟的文件看到(中文翻的還沒有這段文字,英文的才有....=.=)
Because the IIf function does not use short-circuit evaluation, it always evaluates all three of its arguments.
The If operator evaluates its first argument and, depending on the value of the first argument, either the second or the third argument.
所以是因為IIF 不論他是否有滿足條件 他都會執行三段引數
所以即使 Fields!C.Value = 0 他還是會執行到 Fields!P.Value / Fields!C.Value
造成有除數為0的錯誤


因此要把除的動作分成兩段
=IIf(Fields!C.Value = 0, "N/A", Fields!P.Value / IIf(Fields!C.Value = 0, 1, Fields!C.Value))

主要是參照這篇 End of Amnesia (Avoiding Divide By Zero Errors)

有遇到這樣問題的人可以看看

ASP.NET在javascript中取得CheckBoxList 以及DropDownList

CheckBoxList

//檢查XXXX是否選擇
var acclist = document.getElementById("<%=XXX_CheckBoxList.ClientID%>");
for (i = 0; i < acclist.all.tags('input').length; i++) {
if (acclist.all.tags('input')[i].type == 'checkbox') {
accbx = acclist.all.tags('input')[i];
if (accbx.checked) {
...........
}
}
}



DropDownLilst

var o= document.getElementById("<%=XXX_DropDownlist.ClientID%>");
var ovalue=o.options[o.selectedIndex].value

再ASP.NET中前端與後端的驗證

在ASP.NET中控制項是屬於後端處理
因此當你按下Button後
想後端處理前先作前端的驗證而不直接進入後端(也就是畫面閃動)

可使使用Button的onClientClick屬性




如此就可以先驗證再進入後端

如果是要在後端驗證,然後再前端產生警示的script
通常都是會寫Response.write(' ');來警示
但是如果網頁使用到 ajax的updatepanel時
寫Response.write會造成錯誤
因此可使用下列方式來寫入script
ScriptManager.RegisterStartupScript(xxxx, typeof(xxxx), "xxx", "alert('xxxx');", true);
詳細內容可參照
微軟的ScriptManager.RegisterStartupScript 方法