2015年12月16日 星期三

[Javascript] ShowModalDialog 子視窗關閉母視窗更新(含excel下載功能) for IE

目前手上在寫手上的專案
在deadline那天才想到需要完全相容IE環境...

因此才開始檢查相關的功能
發現一個很麻煩的問題

我的主頁打開後會有個button可以點選明細
明細點開後又有一個自己刻的table,畫面上看起來就是新開小視窗

當我這個table關閉時,明細的畫面應該要重新整理
但好死不死在IE環境下會直接給你強迫新開視窗
根據同事的說法,只要在<head>裡面加上這段就好:

<base target="_self"  />

關於<base>的用法請參考
http://www.wibibi.com/info.php?tid=418



以為這樣就結束了,但好戲還在後頭
因為這個明細頁需要將畫面的Gridview下載為excel
但加上了這段,excel的button會被lock...
於是開始請教google大神,找到的解法通常是這樣子:

增加一個iframe在<body>,本來的<form>下面
<iframe id="download" name="download" height="0px" width="0px"></iframe>

然後新增一個<base>,指向這個iframe(當然,只要是base都要在<head裡面>)
<base target="download"  />



執行後發現
新開視窗問題解決了,excel也可以下載
但發現當我畫的table裡面有個button,會觸發明細form的submit
後端程式事都有執行,但前端的畫面不會重整...
找了好久,後來想到應該是因為<base target="download"  />的時候
他會將本來的form切換到我新建的iframe
所以畫面才會一直停留在本來按下submit的那個狀態,但其實後端視有執行的

於是此問題還是沒解
花了大該一天的時間
參考了這篇文章
http://m.xuehuile.com/blog/a3b5d9e9008b411e8a04429497bb9b7d.html
(在此貼出來只是想表達有點像裡面的感覺,利用js去控制)

調整為當我submit的時候,在將<base>調整就好
簡單說就是利用javascript去控制<base>
但記得不要在<head>設定他的target

程式碼如下:

1.設定<base>的id在<head>  →因為要用js去控制

              <base id="default" />

2.在js新增此function(如果有用jquery可以參考上一個文章的寫法)

  function changeBase() {
            document.getElementById("default").setAttribute('target', '_self');
        }

3.在我要執行form submit,去呼叫changeBase()

var oForm = document.getElementById('Form1');
changeBase();                
oForm.submit();


Note.前面提到的的設定都要拿掉,不需要新增加什麼iframe或是另外設定base


花了我好多時間
只能說前端技術真的好難,還是覺得後端的code比較順眼
紀錄一下











2015年11月3日 星期二

[.js]Response.Redirect 轉跳頁面(配合javascript效果)

最近工作上開始瘋狂用到javascript
老實說對js並沒有到非常熟
以前也大概只是一些欄位檢核而已

這兩天被一個問題給困擾著
有一支.aspx的程式,使用user control去呼叫一支.ascx,程式一進入去呼叫外部URL
簡單說就是要維持header 和footer,把網頁遷入在中間

問題來了
header上面有menu選單
正常切換到每個頁面時menu會顯示目前的頁面
但發現使用ascx.cx在page_load時  
Response.Redirect呼叫URL
在這個寫法下,前端的.ascx引用javascript根本沒用

找了很久
終於看到類似的一篇
http://tgw1029.blogspot.tw/2010/03/alertresponseredirectscriptmanager-ajax.html

相信裡面的說明已經非常清楚了
原因是因為javascript是在cilent端執行的
但Response.Redirect會先將網頁導到我要的頁面,所以本來的js程式並不會執行

果然和連結裡面所說的將以上功能都使用js寫入就可以了
我自己後來是寫在.cs裡面(因為還要引用web.config的參數),如果全部寫在.ascx裡面有沒有辦法不知道就是了

另外也因為這個例子發現
如果要把js寫在.cs裡面
包含所有需要用到的js都要先在引用一次
 Response.Write("<script src='XXXXXXXX.js'></script>");
看起來如果直接用是不行的
儘管有在.ascx宣告了

改天再找時間來整理一下前後端的順序關係
(或是有大大可說明也萬分感謝...)



2015年10月29日 星期四

[.net]Gridview 合併標題的處理方式(跨行、跨列)

工作上遇到需要將gridview的欄位合併
但並非資料內容合併,是gridview的表題

網路上找到的幾乎都是資料內容合併的方式
因此決定稍微整理一下最後做出來的結果,留個紀錄

首先整理一下gridview的一些事件

參考來源 : https://msdn.microsoft.com/zh-tw/library/hf8xwy0t.aspx
RowDataBound=>資料列繫結至 GridView 控制項中的資料時發生

RowCreated=>建立 GridView 控制項中的資料列時發生

這兩個事件都是需要在有資料的情況下才會觸發的
相較之下比較常用的為RowDataBound,處理資料欄位的binding
而RowCreated會發生在RowDataBound執行前,兩種都是一筆一筆去執行
意思就是若今天gridview都沒有資料,裡面的調正都不會呈現在web網頁上


若要改變gridview的格式,以VS的工具是做不到的
需要針對這些事件去做調整

再來記錄一下GridViewRow row.RowType的幾個類別
DataControlRowType.Footer =>表尾
DataControlRowType.Header=>表頭
DataControlRowType.DataRow=>資料的row

因此,就看需求需要調整表尾還是表頭或是資料
依序加入判斷
 GridViewRow row = e.Row;

            if (row.RowType == DataControlRowType.DataRow)
//...
          if (row.RowType == DataControlRowType.Header)
//...
          if (row.RowType == DataControlRowType.Footer )
//...

回到正題,今天遇到的狀況是改變標題列
當然我後來也是請求google好不容易才找到下列的參考文章(1)
http://adamschen9921.pixnet.net/blog/post/92005651

根據裡面的敘述大概就可以完成改變標題了
but 我需要的表題其實應該要長這樣



除了跨行之外,我還需要將標題一和標題二的上下row跨行阿
再找上下row合併的有發現幾篇不錯的參考文章(2)

但是這些看起來都是針對資料列去做調整
我需要的是標題要合併
有試過裡面的方式但發現還是沒有用

因此最後決定使用有點土法煉鋼的方法

原始的gridview設定為

(圖一)

step1.
根據我前面的參考文章(1),會先針對目前的row.Cells繼續編號
在此之前要先將(圖一)的標題一和標題二刪除

 tcc.Remove(tcc[0]);
 tcc.Remove(tcc[0]);

為什麼都是tcc[0]?因為對於Gridview來說,刪除一個欄位編號會重編
所以對於這個CASE來說都是刪除最前面的標題


step2.

   intcount = intcount - 2;

 for (int i = 0; i <= intcount - 1; i++)
      {
      tcc.Add(tcc[0]);
       }
執行重新編號後(注意intcount 需要配合刪減長度,意即你remove幾個就要所小幾個長度)
紅色部分為我新增加的,新增加的經過重新排列後如下圖
黃色標題六會因為紅色的標題六rowspan=2所以被擠到後面,這也正是我要的結果


step3.
再來同樣的,合併完需要將多餘標題六的刪除
但標題六為我們合併過後的最後面
 tcc.Remove(tcc[6]);

假如需要刪除的有兩個標題則為
 tcc.Remove(tcc[6]);
 tcc.Remove(tcc[5]);
//....


這樣就完成表格合併的問題了
因為這個例子的欄位比較少,所以會比較容易看出來
但實際上遇到的是十幾個欄位的時候
在測試驗證過程還蠻困難的
所以最後才採用這個比較直觀的方式去做
但相信應該還有更好的方式來處理這類的問題

若有各位大大們有更好的方式再麻煩指教了











2015年10月15日 星期四

[.NET]TAB鍵和AutoPostBack搭配的關係

最近決定再把.NET的基礎拿來翻一翻了
今天再用textbox的練習(我知道很基本...)

忽然想到以前案子常用的tab鍵點下後,游標往後移的例子
大家都知道可以利用tabindex來調整順序

但今天剛好將三個textbox順序訂好了
但發現怎麼換,都會從瀏覽器開始(簡單說就是跑掉了)

找了一下,網路很多都是將tab功能換成enter的例子
想了一下發現其實很簡單
只是因為AutoPostBack都被我設成了true
AutoPostBack的意思是物件內的內容有任何異動,自動完成submit動作
所以在我點選tab時,web會認為是submit的行為,當然tabindex就從瀏覽器開始算了


所以若有表單需要有按鍵可以順序的功能
切記AutoPostBack不能亂設定啊!!!

感覺超基本,但還是需要想一下才會發現
筆記一下

[.net]Windows Server 2012 R2 安裝.net 3.5

最近剛換工作
電腦需要安裝vs 2005 ,vs 2008 及vs2010
但MIS幫我電腦裝的是Windows Server 2012 R2 
除了確定2005無法裝之外,發現2008也會有問題
後來上網找了之後,原來在安裝Windows Server 2012 R2 時
並不會主動裝.net 35,導致在安裝vs 2008 會有問題
因此需要再將安裝光碟放進去,主要是需要安裝包裡面的sources\sxs\

所以需要將光碟檔裡面的sources\sxs\整個複製到電腦路徑的位置

再使用以下方法執行佈署
佈署的方式可參考以下內容:

https://support.microsoft.com/zh-tw/kb/2734782

方法四或方法三
筆記一下


2015年6月14日 星期日

[.net] ViewState Session QueryString 比較

上禮拜跟新同事討論到ViewState  Session的差異
因新同事以前都比較常使用到ViewState而較少使用Session

後來上網找了一下
發現ViewState  Session差蠻多的

ViewState
主要是和Page_load共存亡
好處是不占記憶體,適合單獨頁面client傳遞參數用,但數量較大時仍會影響頻寬
(不過網路上看到的說法頻寬差不了太多)


Session
將資料存放記憶體,相對於ViewState來說方便的是讓兩支aspx交換呈現時,資料仍存在
可以跨頁,資料有時效性(同時是優點也是缺點),且安全性相較起來比較高

而Session也需要注意命名,若兩個頁面取相同的session名稱
則會造成後蓋前的狀況發生



QueryString
可以存放的容量較小,此方式就是把資訊存在網誌上面,再取擷取下來
此方式也不占記憶體,適合拿來用在查詢時所需要的參數傳遞
(但如果參數是有含個資的,此方式可能仍要考慮看看適不適合)

筆記做個紀錄
如果看到有說明錯誤的還請指教補充...


參考資料 :
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20070503235630H1B.html
http://dotnetdic.blogspot.tw/2009/01/aspnet.html