台灣最大程式設計社群網站
線上人數
1306
 
會員總數:246739
討論主題:190152
歡迎您免費加入會員
討論區列表 >> ASP.NET >> Gridview 的 RowDataBound 事件程式改寫
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Gridview 的 RowDataBound 事件程式改寫
價值 : 100 QP  點閱數:7643 回應數:17
樓主

老鄧
門外漢
0 92
1096 223
發送站內信

捐贈 VP 給 老鄧
各位好,請教個效能問題,以下程式碼中,在RowDataBound事件原沒有寫任何程式碼時,資料約5秒可load出來,但寫了以下程式碼,要花約近200秒,想請問有沒有方法改寫,可改善效能?




HTML檔


本篇文章發表於2011-01-24 11:04
1樓
回應

mark shu
捐贈 VP 給 Mark Shu 檢舉此回應
問題點應該是using (OracleConnection oracleConn = new OracleConnection(connStr)){....}
因為若有一千筆資料,就要連結OracleConnection一千次,然後取回資料再做判斷
若是將繫結到ApproveGridView的資料,事先把要用到的欄位透過join或其他方式,一次取回,也許可變快些
本篇文章回覆於2011-01-24 11:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

MIS2000 Lab
檢舉此回應
事件裡面,有這一列IF判別式
if (e.Row.RowType == DataControlRowType.DataRow)

您的 GridView如果一頁裡面有十列紀錄

那麼,您連結OracleConnection與相關的 ADO.NET程式
就要反覆執行十次

看您的GridView並沒有做什麼事(沒用到他內建的分頁、編輯、刪除等功能)
純粹只是「用表格來展示資料而已」

建議改用 HTML Table(表格)來作,又快又輕鬆


GridView有其極限 -- 心裡有劍,手上無劍(不拘泥於手上既有的招式)
http://www.dotblogs.com.tw/mis2000lab/archive/2009/02/25/gridview_limit_090225.aspx




GridView的 RowCreated事件與 RowDataBound事件的小差異
http://www.dotblogs.com.tw/mis2000lab/archive/2010/10/13/gridview_rowcreated_rowdatabound.aspx
本篇文章回覆於2011-01-24 12:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
從程式看來
是每筆資料看是否有估價單,依照估價單的筆數,決定顯示的顏色

這樣的動作是否可以在SQL語法直截做掉(GridView的SelectCommand的SQL)
這樣就不用每一筆Row來來回回的再次取資料,然後做判斷。

^_^
本篇文章回覆於2011-01-24 12:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
To mark shu,謝謝您。
對的,因為若有一千筆資料,就要連結OracleConnection一千次...它會天約數百筆...
您提到"若是將繫結到ApproveGridView的資料,事先把要用到的欄位透過join或其他方式,一次取回,也許可變快些...."
因為
oracleCmd.Parameters.Add(":VENDOR", OracleType.NVarChar, 30).Value = VendorName;
oracleCmd.Parameters.Add(":ITEM", OracleType.NVarChar, 30).Value = ItemName;
這2個參數每筆row在布bind後才知道,將它帶到另一個view當條件找出要的資訊,再做以下條件的比對
想請問您指的"若是將繫結到ApproveGridView的資料,事先把要用到的欄位透過join或其他方式,一次取回,也許可變快些"
是什麼意思,我的需求可以做嗎?
謝謝您

/*if count = 0 查無此單價明細檔 => 底色為綠色

if count = 1
做資料比對
if 廠商明細檔的單價 = PO單價 then 底色不變
if 廠商明細檔的單價 <> PO單價 then 底色紅色

if count > 1 有多筆單價明細檔 => 底色為黃色*/


本篇文章回覆於2011-01-24 12:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

WizardWu
檢舉此回應
GridView 的 RowDataBound 事件,原本就是畫面上那一頁有多少筆資料,就執行多少次。

將此函數裡的程式碼,移至 DataBound 事件處理常式裡,亦即不管畫面上那一頁有多少筆資料,都只執行一次。

若要捉 GridView 裡每一筆資料裡的某一個欄位的值 (或指派某個屬性、顏色…等) :



若要捉 GridView 裡每一筆資料裡的控制項,或指派屬性、顏色…等,就 :
((CheckBox)ApproveGridView.FindControl("ApproveGridView")).Checked = true;


因此可把你的存取 Oracle 資料庫、宣告 DataSet 變數,移到
protected void ApproveGridView_DataBound(object sender, EventArgs e)
裡去處理,只執行一次就好。

本篇文章回覆於2011-01-24 12:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

WizardWu
檢舉此回應
續 5 樓,然後

做法一 :
在 ApproveGridView_DataBound 裡,存取資料庫、宣告 DataSet,然後繼續在同一個
ApproveGridView_DataBound 事件處理常式裡,指派 GridView 每一列裡的顏色。

做法二 :
在 ApproveGridView_DataBound 裡,存取資料庫、宣告 DataSet,然後用某個機制,
想辦法讓 DataSet (或 DataTable) 裡的資料,能夠暫存、能跨函數使用,如: 把整個 DataSet 塞到 ViewState 裡。
然後在 ApproveGridView_RowDataBound 裡,把這個 DataSet 再存出來使用,指派每一列的顏色、…等。
本篇文章回覆於2011-01-24 12:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

雪克
檢舉此回應

你的這段查詢可以在ApproveGridView的DataSource中JOIN進去
查詢會類似下面



然後在ApproveGridView_RowDataBound中在判斷drcCount跟條件來設定顏色
不過詳細的方法還是要照你自己需求去調整
本篇文章回覆於2011-01-24 12:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
To 3F(topcat):謝謝您,感覺好像純用SQL語法無法做掉,提供資料結料結構給您參考

一.ApproveGridView所欲顯示的資料


二、依據ApproveGridView中的2個欄位的值帶到另一table(如下),依帶出的筆數狀況再做以下處理(假設此我們叫顯示2)

/*if count = 0 查無此單價明細檔 => 底色為綠色

if count = 1
做資料比對
if 廠商明細檔的單價(ApproveGridView) = PO單價(顯示2) then 底色不變
(在此需再抓ApproveGridView的單價欄位 和 顯示2的單價欄位做比對)

if 廠商明細檔的單價(ApproveGridView) <> PO單價(顯示2) then 底色紅色
(在此需再抓ApproveGridView的單價欄位 和 顯示2的單價欄位做比對)

if count > 1 有多筆單價明細檔 => 底色為黃色*/




三、目前的結果顯示劃面


本篇文章回覆於2011-01-24 13:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
To 2F,謝謝您,請問"建議改用 HTML Table(表格)來作,又快又輕鬆..."大慨是指什麼方式??
本篇文章回覆於2011-01-24 13:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
To 5F及6F,謝謝您,但我如將原GridView 的 RowDataBound 事件中的程式碼移到移至 DataBound 事件處理常式裡,會變成SQL 語法的2個參數無法帶入(品號及廠商名稱),這2個參數是在pproveGridView中每一筆都可能不同,請問如條件是如此,還能依您方式執行嗎??
本篇文章回覆於2011-01-24 14:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

阿恢
捐贈 VP 給 阿恢 檢舉此回應
to 9樓:
就是先在畫面中,拉一個Table物件,然後在程式裡從cell加到row,再把row加到table裡。

我目前都是用html table方式去使用的,變化多端,又自由...

而且把Row寫成一個class,寫的速度會快很多,要加什麼控制項都可以。
本篇文章回覆於2011-01-24 14:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
To 11F,謝謝您,大慨有個方向,請問您有沒有現成簡單的範例可供參考
本篇文章回覆於2011-01-24 15:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
最有價值解答

WizardWu
檢舉此回應
續 5、6、10 樓,

在 ApproveGridView_DataBound 事件處理常式裡,先依 GridView 的筆數跑 for 迴圈,把每一筆的那兩個參數從畫面上捉起來,
存入一個 Dictionary collection 型別的參數裡,再繼續在 ApproveGridView_DataBound 事件處理常式裡,把這一個 Dictionary (參數的 Set)
當作 ADO.NET 查詢 Oracle 的參數值即可。

若熟 ADO.NET 一些變化應用,只要在 ApproveGridView_DataBound 事件處理常式裡,即可很簡單完成此功能。
本篇文章回覆於2011-01-24 17:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

MIS2000 Lab
檢舉此回應
學到很多東西,這個討論真是讚!

感謝各家高手傳授功力
本篇文章回覆於2011-01-24 17:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

老鄧
捐贈 VP 給 老鄧 檢舉此回應
謝謝各位的幫忙及撥冗回覆,有了方式我再試試,感恩.
本篇文章回覆於2011-01-24 18:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.