none
viewstate 解決 multi-client 問題(dataview,dataset) RRS feed

  • 問題

  • 大家好,

    我寫的網頁第一次page_load會new一個variable,每個client都有一個獨立的variable用來紀錄client的status,並根據status來顯示數據(postback時候顯示filter過的data還是全部data)

     

    這些數據同時提供filtering,edit,delete跟addnew的功能

    但是我無法將這個status值傳給event hanlder,例如

     

    sub GridView1_RowEditing(sender,e)

    ......

    bindgrid(status) 'error因為status沒有define

    end sub

     

    因為他只接受2個arguments,是interface的侷限

    如果我用global variable,例如 shared status as boolean

    multi-client 使用的時候就會出現問題

     

    請問有沒有解決的方法,感激

     

     為方便其他朋友參考,更改了標題

    原標題: event handler intakes (自訂義) argument

     

     

    2007年7月16日 上午 09:35

解答

  • 你是初學者,先不要使用自訂事件,因為那個比較複雜。

    而且你無法覆寫事件的宣告,所以你不能改掉 RowEditing 的參數。

     

    我說的 class-level variable,是指類別層級的變數。 

    Code Snippet

    Public Class MyPage

     

        Private m_Var As Integer = 0 ' 這就是類別層級的變數。

     

        Private Sub Page_Load(...)

        ...

        End Sub

     

        ....

     

    End Class

     

    這種變數可以在類別中的所有成員共用,所以你只要在 binddata() 中取用這個變數值即可。

     

    不過因為這個變數在每次重新載入頁面時都會消失,所以你要用 ViewState 在 Page_Load 時就設定好。 

    Code Snippet

    Private Sub Page_Load(...)

     

        If Page.IsPostBack = False Then

           ....

           ViewState.Add("m_Var", 0)

        End If

     

        Me.m_Var = ViewState("m_Var") ' 取用 ViewState 設定變數值。

     

    End Sub

     

    你可以在函數中設定這個 ViewState: 

    Code Snippet
    ViewState("m_Var") = 1
    2007年7月16日 上午 10:14
    版主

所有回覆

  • 那你有試過 class-level variable 和 ViewState(保存變數資料)了嗎?
    2007年7月16日 上午 09:37
    版主
  • 我才剛開始學vb.net

    你說的class level variable是?

    我試著寫了一個 client 的class

    但是後來想了想

    如果要用event hanlder,不是一樣要pass 那個instance of client進去麼?

    存在同樣的問題

     

    除非所有event handler放到 client這個class裡面,而且page_load能夠new 一個instance of parent class(client)

     

    2007年7月16日 上午 09:58
  • 你是初學者,先不要使用自訂事件,因為那個比較複雜。

    而且你無法覆寫事件的宣告,所以你不能改掉 RowEditing 的參數。

     

    我說的 class-level variable,是指類別層級的變數。 

    Code Snippet

    Public Class MyPage

     

        Private m_Var As Integer = 0 ' 這就是類別層級的變數。

     

        Private Sub Page_Load(...)

        ...

        End Sub

     

        ....

     

    End Class

     

    這種變數可以在類別中的所有成員共用,所以你只要在 binddata() 中取用這個變數值即可。

     

    不過因為這個變數在每次重新載入頁面時都會消失,所以你要用 ViewState 在 Page_Load 時就設定好。 

    Code Snippet

    Private Sub Page_Load(...)

     

        If Page.IsPostBack = False Then

           ....

           ViewState.Add("m_Var", 0)

        End If

     

        Me.m_Var = ViewState("m_Var") ' 取用 ViewState 設定變數值。

     

    End Sub

     

    你可以在函數中設定這個 ViewState: 

    Code Snippet
    ViewState("m_Var") = 1
    2007年7月16日 上午 10:14
    版主
  • 感謝你詳細的答案

    請問如果多於一個用戶使用的時候會不會有問題?

    因為這個class data member 會被所有用戶access到,並可能modify.而並不是每個explorer都有一個獨立的new instance.

     

    page_load裡面如果可以

     

    if !postback

    dim page1 as new mypage

     

    這樣page1才能確定每個剛打開頁面的explorer有獨立的m_var.是麼?

     

    在下比較愚鈍,望加以指點.

    2007年7月16日 上午 10:30
  • 不會,ViewState 是會鎖使用者的。

    另外,每一次瀏覽網頁時類別都會重建,所以你只要保存好 ViewState,就可以在多人使用。

    每個人的 ViewState 都是獨立的,和 Session 一樣。

    2007年7月16日 上午 10:38
    版主
  • 多謝你的教導 viewstate 我已經會用了,解決了大部分問題.

    但是我另外要存一個dataview  dv =(ds.rowfilter=.....)

    viewstate 好像只能用在primitive的數據 因為需要serialize DATA

    要就用viewstate存 dv.sort 來紀錄dv

    但是好像用session 來得比較直接 容易

    我看了一下,好像要宣告這個

    <%@ WebService Language="VB" Class="ServerUsage" %>

     

    是在SOURCE FILE裡面麼?

    還是比較混亂,有一些相關session的參考可以推介給我麼?謝謝

    2007年7月17日 上午 07:23
  • 你存 DataView 比較不切實際。

    應該要存的是 DataTable 或 DataSet (這二個都可序列化)。

     

    DataView 只要在 DataTable/DataSet 由 ViewState 還原時再建就好了。

    2007年7月17日 上午 08:43
    版主
  • rowfilter的dataview會display出來讓用家edit

    那我先試一下你說的方法,讓每個client都保存一個datatable

     

    2007年7月17日 上午 09:14
  • 先謝謝小朱的幫助,

    現在我只差一個scenario沒有pass:

    當我用2個客戶A同B

    A先點選edit第二排資料

    B刪除第一排資料

    然後A點選 update

    A選擇的原來第二排資料到了第一排

    原來第三排資料到了第二,而且被A update了

    也就是說,第三排資料被覆蓋了.

     

    是不是update回傳的時候,dataview只傳回reference index to datatable

    所以當count 值變了或者順序不同,就不能正確更新

    請問是不是只有靠hard code去檢查和更新?

    有沒有更好的方案,感謝

    2007年7月18日 上午 04:00
  • DataView 只是做為 DataTable/DataSet 的一個 View 而已。

    你要改變的是 DataTable/DataSet 中的資料。

     

    如果你的 B 的 Update 是送回資料庫的話,那 A 若有回資料庫撈資料的話,一定也會被改變。

    你可以保存 A 的 DataTable 在 ViewState 中,不要回資料庫撈資料,

    這樣 A 就不會被 B 的 Update 所影響。

     

    不過這會造成幽靈資料(A 有,但資料庫中卻沒有)的狀況,所以你的設計可能要做點變更,

    或是重新 Review 一下你的 Process,看是不是有混淆的地方。

    2007年7月18日 上午 04:52
    版主