2011-01-28 5 views
3

私はASP DataGridを持っており、ソートを適用しています。セッション変数をより効率的に/優先的に使用する方法は?

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand 
    Dim strSortDirection As String = Session("SortDir") 
    If strSortDirection = Nothing Then 
     strSortDirection = " ASC " 
    Else 
     If strSortDirection = " ASC " Then 
      strSortDirection = " DESC " 
     Else 
      strSortDirection = " ASC " 
     End If 
    End If 
    Session("SortDir") = strSortDirection 
    BindData(e.SortExpression & strSortDirection) 
End Sub 

まあ、私はショートカットを作成し、物事が「より簡単に」多分これが一番だろうと思ったようにしよう:まあ、私は例を見ていたとして、彼らはに、名前の異なる、機能的に同様の機能を持っていました:は

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand 
    If Session("SortDir") = Nothing Then 
     Session("SortDir") = " ASC " 
    Else 
     If Session("SortDir") = " ASC " Then 
      Session("SortDir") = " DESC " 
     Else 
      Session("SortDir") = " ASC " 
     End If 
    End If 
    BindData(e.SortExpression & Session("SortDir")) 
End Sub 

しかし、私はそれについて考えていたとして、私はSession("SortDir")が要求毎回作るために持っているかもしれない考え出し、それは一部には影響を与えたり、欠点かもしれません。しかし、私は確信していませんでした。誰かが最良の方法や好きな方法を説明するリンクを持っていますか?ありがとう。

+0

外側の 'If'条件は冗長ではありませんか? –

+0

はい、そうでした。私はそれを思っていたので、私はそれを入力していた。:) – XstreamINsanity

答えて

1

セッション値を4回ではなく2回(1回の読み取りと1回の書き込み)検索すると明らかに優れているようです。パフォーマンスの違いはユーザーには気付かれませんが、これらの冗長検索はすべてのプログラマーに非常に不快感を与えます。このようなことが、コレクションに格納されているデータの量や実行された参照のタイプ(ハッシュテーブル、バイナリ検索、シーケンシャル検索など)を犠牲にして、目に見える違いを生む場合があります。に入る良い習慣ではありません。

+0

ええ、それは私を不安にさせたので、私は尋ねました。私は技術的にウェブプログラミングに新しいので、おそらく不安は気づかなかったでしょう。 – XstreamINsanity

1

これは、このシナリオでは、これを行うより良い方法があるため、これはセッションの使い方が良くありません。セッションには、エンドユーザーに関する特定のデータが何らかの形で含まれている必要があります。

これらの線に沿って何か

Private Property _SortDir As Nullable(Of String) ''# I used "Nullable(Of" because I don't know if you are able to use "String?" 
Public Property SortDir() As Nullable(Of String) 
    Get 
     Return _SortDir 
    End Get 
    Set 
     _SortDir = value 
    End Set 
End Property 

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand 

    If SortDir.IsNullOrEmpty Or SortDir = "DESC" Then 
     SortDir = "ASC" 
    Else 
     SortDir = "DESC" 
    End If 

    BindData(e.SortExpression & SortDir)) 
End Sub 

を試してみて、私は、しかし、それはいくつかの厄介な副作用を持っているでしょう、あなたはセッションではsortOrderを保持したい場合があります一つの他の理由を考えました。現在のページを離れ、後で同じソート順で戻ってくる場合は、セッションに残しておきます...しかし、サイトの別の場所に別のグリッドがあれば、別のセッション変数を持っていますか?それ?新しいグリッドに既存のソート順を保持する予定ですか?これらは、セッション変数を使用する際に考える必要があるすべてのものです。

既存のページに滞在している場合は、そのページで自由に使用できるアイテムを使用してください。ちょっと、あなたも "_VIEWSTATE"を使ってソート順を保存することができました(私はそれをお勧めしませんが)。

ウェブはステートレスになるように設計されているため、「状態」を作成することはやや望ましくありません。

最後に、

あなたのクエリー文字列にソート順を入れ、それ以外のことはすべて忘れてしまいます(AJAXでは完全に機能しません)。

+0

その問題は、SortDirが毎回リセットされることです。しかし、ありがとう。 – XstreamINsanity

+0

あなたはいつもセッション変数を変更しています。セッションはクライアントマシン上にクッキーをドロップするので、毎回変数をリセットするだけでなく、セッションで毎回データを送信しています。 –

+0

愚かな外部IFブロックを削除するように編集しました。 –

0

あなたはセッションレベルの持続をしたいので、私はさんの提案rockinthesixstring に二つの小さな変更を加えたい:

(警告:!VBを作成しようとC#のコーダ)

Private Property _SortDir As Nullable(Of String) 
Public Property SortDir() As Nullable(Of String) 
    Get 
     Return _SortDir 
    End Get 
    Set 
     Session("SortDir") = value 
     _SortDir = value 
    End Set 
End Property 

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand 

    If SortDir = "ASC" Then 'I think the outer If block was redundant'' 
     SortDir = "DESC" 
    Else 
     SortDir = "ASC" 
    End If 

    BindData(e.SortExpression & SortDir)) 
End Sub 

Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
    If Not Page.IsPostBack Then 
     _SortDir = Session("SortDir") 
    End If 
End Sub 

このコードは大部分がC &です。rockinthesixstringですので、この回答を使用する場合は、受け入れるか、アップアップしてください。

+0

また、Ifブロックを削除しました。それはちょっと馬鹿だった。 –

+0

また、プロパティにPage_Loadの値があることを確認している場合は、Nullableにする必要はありません。 - はい、この猫をスキンする方法はたくさんあります;-) –

+0

@rockinthesixstringは文字列ではありません既にVBではnull可能ですか?彼らはC#であり、実際に私が知っているすべての他の言語は、それを考えるようになります。 nullに初期化するだけですか? –

関連する問題