none
ObjectDataSource+TextBox實作換頁的問題 RRS feed

  • 問題

  • 各位前輩:

     

    因為傳統的GridView分頁(即在PageIndexChanged事件指定PageIndex)遇到Select資料筆數很大時會有效能問題

    所以我利用ObjectDataSource來做

    就是指定StartRowIndexParameterName、MaximumRowsParameterName和其他需要的SelectParameter

    如:畫面TextBox、DropDownList的值

    但是StartRowIndex會因現在PageIndex的值設定成巡覽的列號

    如果user在換頁後又更改TextBox的值然後按下"查詢"

    這下BussinessObject指定的SelectMethod卻使用上一次的頁碼巡覽

    我利用DotJum在 http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=279057&SiteID=14  提出的方法

    就是在Button_Click時new ObjectDataSource 的instance

    每次重新查詢的時候都會利用最新的ObjectDataSource的Select方法

    但是換頁就不行了,因為ObjectDataSource 的instance在PostBack時已經不存在!

     

    我想請問的是: 利用ObjectDataSource若有結合畫面控制項,實作分頁是不是很麻煩?

    還是有什麼步驟我疏忽了?

     

    ps. 因為我們做的系統每天會產生五六百筆資料,逐日累積下是非常可觀的

    所以當查詢結果的資料筆數很大時,分頁是必會影響效能

    我同事提出把查詢的結果存在session,然後postback時再利用session的資料分頁

    但是我覺得這樣很耗memory....

    2008年9月25日 上午 02:02

解答

  • 你可以稍作變化即可:

    不用在程式中new objectdatasource,直接在畫面上拉一個, 例如拉了一個myobject的ObjectDataSource,

    然後在程式中撰寫:

    Code Snippet

      myobject.SelectMethod = "GetCust";
            myobject.SelectParameters.Add("strCountry", TypeCode.String, "");
            myobject.SelectParameters[0].DefaultValue = "Mexico";   
            GridView1.DataSource = objDS2;
            GridView1.DataBind();    

     

     

     

    這樣就不用管Postback後會不見的問題了.

     

    查詢結果放在session,如果筆數很大,的確是個不好的作法.

     

    以上供您參考

    • 已標示為解答 Lolota Lee 2009年4月2日 上午 06:53
    2008年9月25日 上午 02:42
    版主

所有回覆

  • 你可以稍作變化即可:

    不用在程式中new objectdatasource,直接在畫面上拉一個, 例如拉了一個myobject的ObjectDataSource,

    然後在程式中撰寫:

    Code Snippet

      myobject.SelectMethod = "GetCust";
            myobject.SelectParameters.Add("strCountry", TypeCode.String, "");
            myobject.SelectParameters[0].DefaultValue = "Mexico";   
            GridView1.DataSource = objDS2;
            GridView1.DataBind();    

     

     

     

    這樣就不用管Postback後會不見的問題了.

     

    查詢結果放在session,如果筆數很大,的確是個不好的作法.

     

    以上供您參考

    • 已標示為解答 Lolota Lee 2009年4月2日 上午 06:53
    2008年9月25日 上午 02:42
    版主
  • 謝謝您!

    我照你的作法弄

    但是它出現PageIndexChanging未處理的錯誤

    我去設定了GridView.PageIndex=e.NewPageIndex

    然後再設定SelectMethod.......,OK! 成功了

     

    我想應該可以把ObjectDataSource的相關屬性設定在aspx畫面

    但是有一些問題

    <aspSurprisebjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUsers" EnablePaging="true"
                TypeName="DatabaseUtility.MATUtil" SelectCountMethod="GetRecordCount" StartRowIndexParameterName="StartIndex" MaximumRowsParameterName="PageSize">
                <SelectParameters>
                    <asp:ControlParameter ControlID="TextBox1" Name="UserID" PropertyName="Text" Type="String" />
                    <aspStick out tonguearameter Name="StartIndex" Type="Int32" />
                    <aspStick out tonguearameter Name="PageSize" Type="Int32" />
                </SelectParameters>

    這是我用精靈設定的,執行的時候他說找不到帶參數的ControlID、StartIndex、PageSize的GetUsers()

    但是實際上我的GetUsers()的確存在也具備這三個參數!

     

    我發現如果我在頁面用精靈加入SelectMethod那嚜SelectCountMethod指定的method也要有SelectParameters內的參數

    包含StartRowIndexParameterName、MaximumRowsParameterName指定的參數名稱

    但是如果在.vb中用程式的方式加入SelectParameter就不需要這兩個參數了

    是不是精靈幫我加入的那兩個參數有問題(紅色字)

     

    廢話有點多, 多謝指教!

    2008年9月25日 上午 04:22
  • 還有一個小問題

    為什麼我在頁面設定ObjectDataSource屬性

    換頁的時候不會觸發GridView.PageIndexChanging(因為他沒有要求我處理事件)

    但是如果只拉ObjectDataSource到畫面,然後設定的部份交給vb做

    換頁時就會要求我處理PageIndexChanging

    而且還要再把ObjectDataSource那些屬性再設一遍,即使我在前一次postBack已經做了!

    我try過只拉ObjectDataSource到畫面是宣告畫面有這個物件

    在每次postBack設定的屬性內容在下次postback時是不會保留的

    那後端給定屬性有比畫面給定好嗎

     

    多謝指教!

    2008年9月25日 上午 04:50